home *** CD-ROM | disk | FTP | other *** search
/ Aminet 32 / Aminet 32 (1999)(Schatztruhe)[!][Aug 1999].iso / Aminet / docs / misc / rusdevdocs.lha / programming < prev   
Text File  |  1999-05-16  |  105KB  |  2,104 lines

  1.  
  2.    Ïðîãðàììèðîâàíèå ïîä AmigaOS äëÿ íà÷èíàþùèõ, âåðñèÿ 2.1 beta
  3.  
  4.    (C) 1999 RDC
  5.  
  6.  
  7.   0) Ðÿä çàìå÷àíèé
  8.  
  9.      Ïðåæäå âñåãî, ïðåäïîëàãàåòñÿ, ÷òî ñ ïðîãðàììèðîâàíèåì êàê òàêîâûì
  10. Âû â îáùåì óæå çíàêîìû - íàïðèìåð, ðàáîòàëè ðàíåå íà ÁÊ, Ñïåêòðóìå,
  11. PC.  Ïðèâåòñòâóåòñÿ çíàíèå Ñè, îïûò ïðîãðàììèðîâàíèÿ íà êàêîì-ëèáî èç
  12. àññåìáëåðîâ, çíàíèå àðõèòåêòóð êîìïüþòåðîâ.  Ýòîò òåêñò íå ðàññ÷èòàí
  13. íà òîò ñëó÷àé, åñëè Âû ðåøèëè íà÷àòü ïîëíîñòüþ ñ íóëÿ.  Â òàêîì ñëó÷àå
  14. ðåêîìåíäóåòñÿ íà÷àòü ñ ÷åãî-ëèáî áîëåå ïðîñòîãî - íàïðèìåð, ñ èçó÷åíèÿ
  15. òîãî æå Ñè.
  16.      Êðîìå òîãî, î÷åíü ðåêîìåíäóåòñÿ èìåòü îáùåå ïðåäñòàâëåíèå îá
  17. àðõèòåêòóðå è îñîáåííîñòÿõ Àìèãè â öåëîì.  Äëÿ ýòîãî ïî÷èòàéòå êíèãó
  18. Ä.Ìèõàéëîâà «AMIGA #1».  Âïðî÷åì, êíèãà ýòà áóäåò ïîëåçíà âñåì - îíà
  19. ÿâëÿåòñÿ âåëèêîëåïíûì ñïðàâî÷íèêîì ïî êîìàíäíîìó ÿçûêó DOS è ARexx.
  20.  
  21.      Çäåñü íå áóäåò ðàññìàòðèâàòüñÿ ïðîãðàììèðîâàíèå ñ èñïîëüçîâàíèåì
  22. áèáëèîòåê ââîäà-âûâîäà ANSI C è îáû÷íîãî äëÿ Ñè ñòàðòàï-êîäà.  Ðå÷ü
  23. ïîéä¸ò èñêëþ÷èòåëüíî î ïðîãðàììèðîâàíèè ïîä AmigaOS.
  24.  
  25.  
  26.   1) Ñðåäñòâà ðàçðàáîòêè
  27.  
  28.      Ïðîãðàììû ïîä Àìèãó, êàê ïðàâèëî, ïèøóòñÿ íà Ñè è/èëè Àññåìáëåðå.
  29. Ðàçóìååòñÿ, ÿçûêîâ ïðîãðàììèðîâàíèÿ äîñòóïíî â äåñÿòêè ðàç áîëüøå, íî
  30. ïîääåðæêà â îñíîâíîì èä¸ò äëÿ C/Asm, è âñÿ äîêóìåíòàöèÿ è ïðèìåðû
  31. îáû÷íî ðàññ÷èòûâàþòñÿ èìåííî íà íèõ.
  32.      Â íàñòîÿùåå âðåìÿ ñóùåñòâóåò ìíîæåñòâî ðàçëè÷íûõ àññåìáëåðîâ.
  33. Îíè ñóùåñòâóþò êàê â âèäå îòäåëüíûõ òðàíñëÿòîðîâ (íàïðèìåð, PhxAss),
  34. òàê è â âèäå ïðîãðàììíûõ ïàêåòîâ òèïà Devpac - â êîìïëåêòå òåêñòîâûé
  35. ðåäàêòîð-îáîëî÷êà, ñîáñòâåííî òðàíñëÿòîð, è îòëàä÷èê.  Ðàçíûå
  36. òðàíñëÿòîðû ðàçëè÷àþòñÿ ñêîðîñòüþ òðàíñëÿöèè è êîððåêòíîñòüþ.
  37. Íàïðèìåð, GenAm (èç êîìïëåêòà Devpac) íå ñëèøêîì áûñòð, à PhxAss ïðè
  38. äîñòàòî÷íîé ñêîðîñòè «íå ïîíèìàåò» íåêîòîðûå ïîëåçíûå ïðè¸ìû.  Â
  39. îáùåì, âûáîð òðàíñëÿòîðà - äåëî âêóñà.  Ðåäàêòîð ãîäèòñÿ ëþáîé - ê
  40. ïðèìåðó, ÿ èñïîëüçóþ îáû÷íûé CygnusED âìåñòî «ðîäíîãî» ðåäàêòîðà
  41. Devpac.
  42.      Íàèáîëåå ïîïóëÿðíûé êîìïèëÿòîð Ñè - SAS/C, îí æå äà¸ò íàèáîëåå
  43. îïòèìàëüíûé êîä ïîä 680x0.  Ñóùåñòâóåò òàêæå Hisoft C, óñòóïàþùèé åìó
  44. â êà÷åñòâå êîäà, íî èìåþùèé èñêëþ÷èòåëüíî ïðèÿòíóþ è óäîáíóþ ñðåäó
  45. ðàçðàáîòêè.  Êðîìå òîãî, ñóùåñòâóåò ðÿä êîìïèëÿòîðîâ òèïà gcc, vbcc,
  46. egcs - ïîðòèðîâàííûõ èç-ïîä UNIX.
  47.  
  48.      Ðàáîòà ñî âñåì ïåðå÷èñëåííûì áóäåò îïèñàíà îòäåëüíî.
  49.  
  50.  
  51.   2) Êàêóþ ëèòåðàòóðó æåëàòåëüíî èìåòü
  52.  
  53.      Âî-ïåðâûõ, íóæíà êíèãà ïî ïðîãðàììèðîâàíèþ ñåðèè 680x0 íà
  54. àññåìáëåðå.  Ñóùåñòâóþò äîêóìåíòàöèè ïî 68000, 68020 è 68030 íà
  55. ðóññêîì ÿçûêå â ýëåêòðîííîì âèäå.  Êíèãè íà àíãëèéñêîì ÿçûêå ïî ëþáûì
  56. èìåþùèìñÿ â àññîðòèìåíòå ïðîöåññîðàì áåñïëàòíî âûñûëàåò ïî ïî÷òå ôèðìà
  57. Motorola, íà å¸ Web-ñàéòå äîñòóïíû pdf-âåðñèè êíèã.
  58.  
  59.      Âî-âòîðûõ, ïîëåçíû ëþáûå êíèãè ïî Ñè.  Â ýòîì êà÷åñòâå èìååò
  60. ñìûñë îáðàòèòü âíèìàíèå íà êíèãó Àëëåíà Ãîëóáà «C&C++: ïðàâèëà
  61. ïðîãðàììèðîâàíèÿ».  Â ýëåêòðîííîì âèäå îíà, ê ñîæàëåíèþ, ïîêà
  62. íåäîñòóïíà.  Êíèãà ñîäåðæèò ìíîæåñòâî ïîëåçíûõ ðåêîìåíäàöèé ïî ñòèëþ è
  63. ïðè¸ìàì ïðîãðàììèðîâàíèÿ íà Ñè.
  64.      Êðîìå òîãî, ñóùåñòâóåò â ýëåêòðîííîì âèäå êëàññè÷åñêàÿ êíèãà
  65. àâòîðîâ Ñè - Êåðíèãàíà è Ðè÷è, è ðÿä äðóãèõ äîêóìåíòîâ.
  66.  
  67.      Â-òðåòüèõ, íóæíû êíèãè ïî ïðîãðàììèðîâàíèþ AmigaOS.  Â ýòîé ñâÿçè
  68. íåîáõîäèìû äâà èçäàíèÿ: ROM Kernel Reference Manual è Guru Book.  Îáà
  69. ñóùåñòâóþò â ýëåêòðîííîì âèäå.  Åñòü òàêæå ðÿä äðóãèõ êíèã.
  70.      Íåîáõîäèìî èìåòü àâòîäîêè - äîêóìåíòàöèþ ïî ðàçëè÷íûì áèáëèîòåêàì
  71. ñèñòåìû, ãäå îïèñàíà êàæäàÿ èõ ôóíêöèÿ.
  72.  
  73.      Íó è â-÷åòâ¸ðòûõ, âåñüìà ïîëåçíà áóäåò âîîáùå âñÿêàÿ ëèòåðàòóðà
  74. ïî ïðîãðàììèðîâàíèþ, íå ïðèâÿçàííàÿ ê êîíêðåòíîé ïëàòôîðìå.  Ê
  75. ïðèìåðó, ñòîèò îòìåòèòü «Èñêóññòâî ïðîãðàììèðîâàíèÿ» Äîíàëüäà Êíóòà,
  76. èçäàâàâøååñÿ â 70õ ãîäàõ íà ðóññêîì ÿçûêå, íî è ñ òåõ ïîð íå
  77. ïîòåðÿâøåå ñâîåé àêòóàëüíîñòè.
  78.  
  79.  
  80.   3) Ñ ÷åãî íà÷àòü
  81.  
  82.      Ñ ìîåé òî÷êè çðåíèÿ, ëó÷øå âñåãî íàéòè êàêóþ-ëèáî «íèøó», íå çàíÿòóþ
  83. äðóãèìè ïðîãðàììàìè, è íà÷àòü ðàáîòàòü â ýòîì íàïðàâëåíèè.  Ñëîæíîñòü
  84. ïðîãðàììû çàâèñèò îò òîãî, êàêîé îïûò ó Âàñ óæå åñòü.  Åñëè ðàíåå Âû
  85. ðàáîòàëè ñ äðóãèìè ïëàòôîðìàìè íà äîñòàòî÷íî ñåðü¸çíîì óðîâíå, ìîæåòå
  86. ñïîêîéíî áðàòüñÿ çà ïðîåêò ëþáîé ñëîæíîñòè, åñëè ñ÷èòàåòå, ÷òî Âû åãî
  87. «ïîòÿíåòå».  Åñëè Àìèãà äëÿ Âàñ - ïåðâûé ïîëèãîí äëÿ ïðîãðàììèðîâàíèÿ,
  88. ëó÷øå íà÷àòü ñ ÷åãî-íèáóäü ïîïðîùå - êàêîé-íèáóäü ìåëêîé óòèëèòêè,
  89. íàïðèìåð.  Òóïîå ÷òåíèå âñåé ïîäðÿä ëèòåðàòóðû âðÿä ëè ÷òî-íèáóäü äàñò,
  90. ëó÷øèé ìåòîä íàó÷èòüñÿ ÷åìó-ëèáî - ïîïðîáîâàòü ýòî ñäåëàòü ñàìîñòîÿòåëüíî.
  91.      Íå ñòîèò áðàòüñÿ çà îòíîñèòåëüíî ñëîæíûå ïðîåêòû, íå èìåÿ
  92. äîñòàòî÷íîãî îïûòà.  Âïîëíå âîçìîæíî, ÷òî âðîäå áû âñ¸ è ïîëó÷èòñÿ, íî Âàì
  93. æå ñàìèì ïîòîì áóäåò îáèäíî, êîãäà Âû óçíàåòå, ÷òî âñ¸ ðàíåå ñäåëàííîå
  94. ìîæíî áûëî ñäåëàòü âî ìíîãî ðàç áûñòðåå è êîìïàêòíåå.
  95.  
  96.  
  97.   4) Êàê íóæíî ïèñàòü ïðîãðàììû, è êàê èõ ïèñàòü íå ñëåäóåò
  98.  
  99.      Ýòîò âîïðîñ äëÿ Àìèãè î÷åíü âàæåí.  Åñëè Âû ðàíåå ðàáîòàëè íà
  100. ðàçëè÷íûõ ìàøèíàõ - ÁÊ, Ñïåêòðóì, Àãàò è ò.ï., ñòîèò çàìåòèòü, ÷òî ìåòîäû
  101. ðàáîòû ïðîãðàììû íå áûëè îñîáî êðèòè÷íû.  Êàæäàÿ ïðîãðàììà ðàáîòàëà ñàìà
  102. ïî ñåáå è ìîãëà áûòü ïîëíîâëàñòíûì õîçÿèíîì ìàøèíû.  Îïåðàöèîííûå ñèñòåìû
  103. áûëè ôàêòè÷åñêè ïóñòûì çâóêîì.
  104.      Íà Àìèãå ÎÑ - âàæíåéøàÿ ÷àñòü ìàøèíû.  AmigaOS âûñòóïàåò ïîñðåäíèêîì
  105. ìåæäó ïðîãðàììîé è «æåëåçîì» (è ïîëüçîâàòåëåì).  Ïîñêîëüêó AmigaOS ìîæåò
  106. âûïîëíÿòü ïðîãðàììû îäíîâðåìåííî, íèêàêàÿ êîððåêòíî íàïèñàííàÿ ïðîãðàììà
  107. íå èìååò ïðàâà áðàòü êîíòðîëü íàä ìàøèíîé - ýòî ìîæåò ïîìåøàòü ðàáîòå
  108. äðóãèõ ïðîãðàìì.  «Æåëåçà» äëÿ ïðîãðàììû êàê áû íå ñóùåñòâóåò, è âñå
  109. îïåðàöèè ïðîãðàììà îáÿçàíà ïðîèçâîäèòü, âûçûâàÿ îïåðàöèîííóþ ñèñòåìó.
  110. AmigaOS ïðåäîñòàâëÿåò âåëèêîëåïíóþ âîçìîæíîñòü ñäåëàòü ïðàêòè÷åñêè âñ¸ ñ
  111. ïîìîùüþ ñâîèõ âûçîâîâ.  Çà ñ÷¸ò ýòîãî ìîæíî ïèñàòü ïðîãðàììû, ñîâåðøåííî
  112. íåçàâèñèìûå îò æåëåçà - ÿðêèì ïðèìåðîì ÿâëÿåòñÿ êîìïüþòåð DraCo, êîòîðûé
  113. èìååò ñ Àìèãîé òîëüêî îáùèé ïðîöåññîð, íî çà ñ÷¸ò ïîëíîñòüþ ñîâìåñòèìîé
  114. «îïåðàöèîíêè» âûïîëíÿåò ëþáûå ÊÎÐÐÅÊÒÍΠÍÀÏÈÑÀÍÍÛÅ ïðîãðàììû äëÿ Àìèãè.
  115. Ñëåäîâàíèå ïðàâèëàì ðàáîòû ñ ñèñòåìîé òàêæå ãàðàíòèðóåò ðàáîòîñïîñîáíîñòü
  116. ïðîãðàììû íà áóäóùèõ âåðñèÿõ ÎÑ è íîâûõ ìàøèíàõ.
  117.      Â íåêîòîðûõ ñëó÷àÿõ ðàáîòà ñ æåëåçîì ïîçâîëÿåò ðåçêî óâåëè÷èòü
  118. ïðîèçâîäèòåëüíîñòü ðàáîòû ïðîãðàììû - íàïðèìåð, ïðÿìàÿ çàïèñü â
  119. âèäåîïàìÿòü.  Îäíàêî, òàêîé ïîäõîä ìîæåò ðàáîòàòü íå âî âñåõ ñëó÷àÿõ, à
  120. òàêæå íåò íèêàêèõ ãàðàíòèé, ÷òî ýòî áóäåò ðàáîòàòü â áóäóùåì.  Â òàêèõ
  121. ñëó÷àÿõ èìååò ñìûñë ñäåëàòü îïöèþ â íàñòðîéêàõ ïðîãðàììû, óñòàíàâëèâàåìóþ
  122. âðó÷íóþ - ðàáîòà íàïðÿìóþ (custom routines) èëè ÷åðåç ÎÑ.  Â ëþáîì ñëó÷àå
  123. íåñîâìåñòèìîñòè ïîëüçîâàòåëü äîëæåí èìåòü âîçìîæíîñòü çàïóñòèòü ïðîãðàììó
  124. â «êîððåêòíîì» ðåæèìå.
  125.      Åù¸ îäèí âàæíûé ìîìåíò.  Äåëàéòå ïðîãðàììû óíèâåðñàëüíûìè.  Íèêîãäà
  126. íå ñòîèò äåëàòü ïðåäïîëîæåíèé òèïà «âðÿä ëè ó ïîëüçîâàòåëÿ áóäåò âèí÷åñòåð
  127. áîëåå 4 ãèãàáàéò» (ïîäóìàéòå ñàìè: òàêîé ïîäõîä ëåò ïÿòü íàçàä áûë áû
  128. âïîëíå íîðìàëüíûì!) èëè «âðÿä ëè ïîëüçîâàòåëü çàïóñòèò ïàðàëëåëüíî åù¸
  129. îäèí ìóçûêàëüíûé ïëååð».  Ïðè ðåàëèçàöèè êàêîãî-ëèáî àëãîðèòìà îáÿçàòåëüíî
  130. «ïðîêðóòèòå» â óìå ëþáûå, äàæå ñàìûå èçîùð¸ííûå, íåðåàëüíûå è íåâåðîÿòíûå
  131. ñèòóàöèè.  Ïîìíèòå - äàæå íåçàðÿæ¸ííîå ðóæü¸ ðàç â ãîä ñòðåëÿåò ;)
  132.  
  133.  
  134.   5) AmigaOS ñ ñàìîãî íà÷àëà
  135.  
  136.      AmigaOS îòëè÷àåò îò áîëüøèíñòâà äðóãèõ îïåðàöèîííûõ ñèñòåì å¸
  137. ìîäóëüíîñòü è ðàçäåëÿåìûå ðåñóðñû.  AmigaOS ñîñòîèò èç «êèðïè÷èêîâ»,
  138. êàæäûé èç êîòîðûõ âûïîëíÿåò îïðåäåë¸ííóþ çàäà÷ó, è äëÿ ðåøåíèÿ êîíêðåòíîé
  139. çàäà÷è èñïîëüçóþòñÿ òîëüêî òå ìîäóëè, êîòîðûå ðåàëüíî íóæíû.  Åñëè îäèí è
  140. òîò æå ìîäóëü íóæåí äëÿ âûïîëíåíèÿ íåñêîëüêèõ çàäà÷, â ïàìÿòè îí
  141. ñóùåñòâóåò â âèäå îäíîé êîïèè, ñ òàê íàçûâàåìûì ðååíòåðàáåëüíûì
  142. (ðàçäåëÿåìûì) êîäîì.
  143.      Ïîëüçîâàòåëüñêàÿ ïðîãðàììà âçàèìîäåéñòâóåò ñ ýòèìè ìîäóëÿìè, è èìååò
  144. âîçìîæíîñòü çàäåéñòâîâàòü òå èëè èíûå ôóíêöèè ñèñòåìû, âûçûâàÿ èõ.
  145. Âíóòðåííåå óñòðîéñòâî AmigaOS ìîæíî ïðåäñòàâèòü â âèäå äåðåâà,
  146. ðàçâåòâë¸ííàÿ ñòðóêòóðà êîòîðîãî ñîîòâåòñòâóåò ðàçëè÷íûì «âíóòðåííîñòÿì»
  147. ñèñòåìû.  AmigaOS íèêàê íå ïðèâÿçàíà ê êîíêðåòíûì ôèçè÷åñêèì àäðåñàì â
  148. ïàìÿòè, è åäèíñòâåííûì èñêëþ÷åíèåì èç ýòîãî ïðàâèëà ñëóæèò ÿ÷åéêà ñ
  149. àáñîëþòíûì àäðåñîì 4, íàçûâàåìàÿ SysBase.
  150.  
  151.  
  152.   6) Áèáëèîòåêè
  153.  
  154.      Ðàçäåëÿåìûå áèáëèîòåêè (shared libraries) - îäèí èç «êèðïè÷èêîâ»
  155. AmigaOS.  Áèáëèîòåêè èìåþò íàáîð òî÷åê âõîäà, ñ òî÷êè çðåíèÿ
  156. àññåìáëåðà âûçûâàåìûõ êîìàíäîé jsr ïðîöåññîðà.  Ñ òî÷êè çðåíèÿ Ñè -
  157. ýòî îáû÷íûå âíåøíèå ôóíêöèè.  Ýòè òî÷êè âõîäà è åñòü API (Application
  158. Program Interface) AmigaOS.  Êàæäàÿ áèáëèîòåêà èìååò òàê íàçûâàåìóþ
  159. áàçó - óêàçàòåëü íà ñëóæåáíóþ ñòðóêòóðó äàííûõ áèáëèîòåêè (struct
  160. Library). Ñëóæåáíûå äàííûå õðàíÿòñÿ ïî ïîëîæèòåëüíûì ñìåùåíèÿì îò
  161. áàçû, à òî÷êè âõîäà íàõîäÿòñÿ ïî îòðèöàòåëüíûì ñìåùåíèÿì.  Ôèçè÷åñêè
  162. ïî àäðåñàì òî÷åê âõîäà ðàçìåùåíû êîìàíäû jmp, ïåðåõîäÿùèå íà ðåàëüíûå
  163. àäðåñà ýòèõ ôóíêöèé.
  164.      Ðàçäåëÿåìûìè ýòè áèáëèîòåêè íàçûâàþòñÿ ïîòîìó, ÷òî âñåãäà èìåþò â
  165. ïàìÿòè âñåãî îäíó êîïèþ ñâîåãî êîäà.  Åñëè áèáëèîòåêó èñïîëüçóþò
  166. íåñêîëüêî ïðîãðàìì, îíè âûçûâàþò îäèí è òîò æå êîä.  Áèáëèîòåêà âñåãäà
  167. ïðèñóòñòâóåò â ïàìÿòè, åñëè îíà íóæíà õîòÿ áû îäíîé ïðîãðàììå.  Äàæå
  168. åñëè â äàííûé ìîìåíò îíà óæå íå íóæíà, îíà áóäåò ïðèñóòñòâîâàòü â
  169. ïàìÿòè äî òåõ ïîð, ïîêà åñòü äîñòàòî÷íî ñâîáîäíîé ïàìÿòè.  Êàê òîëüêî
  170. ïàìÿòè íå áóäåò õâàòàòü, íåèñïîëüçóåìûå áèáëèîòåêè àâòîìàòè÷åñêè
  171. âûãðóæàþòñÿ èç ïàìÿòè.
  172.      Áèáëèîòåêè áûâàþò äâóõ òèïîâ - íàõîäÿùèåñÿ â ÏÇÓ è äèñêîâûå.  Â ÏÇÓ
  173. «çàøèòû» îñíîâíûå ôóíêöèè ñèñòåìû - ðàáîòà ñ ðåñóðñàìè ìàøèíû, äèñêîì è
  174. ãðàôèêîé, à òàê æå íåêîòîðûå ñëóæåáíûå ôóíêöèè.  Âñå îñòàëüíûå áèáëèîòåêè
  175. ïðè ïåðâîé ïîòðåáíîñòè â íèõ çàãðóæàþòñÿ ñ äèñêà.
  176.      Êàæäàÿ áèáëèîòåêà èìååò íîìåð âåðñèè.  Ìåõàíèçì âåðñèé ïîçâîëÿåò
  177. ïîñòåïåííî íàðàùèâàòü âîçìîæíîñòè áèáëèîòåê, ñîõðàíÿÿ ñîâìåñòèìîñòü ñî
  178. ñòàðûìè âåðñèÿìè, è íå äîïóñêàòü ñèòóàöèé äîñòóïà áîëåå íîâûõ ïðîãðàìì
  179. ê ôóíêöèÿì, îòñóòñòâóþùèì ó ñòàðûõ áèáëèîòåê.
  180.  
  181.      Ïåðåä òåì, êàê âûçâàòü áèáëèîòåêó ïåðâûé ðàç, å¸ íåîáõîäèìî
  182. îòêðûòü.  Åäèíñòâåííàÿ áèáëèîòåêà, êîòîðàÿ ýòîãî íå òðåáóåò - ýòî
  183. Exec, îíà îòêðûòà âñåãäà è íàõîäèòñÿ â ÏÇÓ.  Îòêðûâàåòñÿ áèáëèîòåêà
  184. âûçîâîì ôóíêöèè OpenLibrary(), àðãóìåíòàìè êîòîðîé ñëóæàò óêàçàòåëü íà
  185. èìÿ áèáëèîòåêè è ìèíèìàëüíî íåîáõîäèìûé íîìåð âåðñèè.  Åñëè áèáëèîòåêà
  186. äîñòóïíà, è å¸ íîìåð âåðñèè ðàâåí èëè áîëüøå òðåáóåìîãî - ôóíêöèÿ
  187. âåðí¸ò óêàçàòåëü íà áàçó áèáëèîòåêè, èíà÷å áóäåò âîçâðàù¸í íóëü.
  188.      Exec âñåãäà îòêðûò, è óêàçàòåëü íà åãî áàçó íàõîäèòñÿ â ÿ÷åéêå
  189. ïàìÿòè ñ àáñîëþòíûì àäðåñîì 4.
  190.      Ïîñëå èñïîëüçîâàíèÿ áèáëèîòåêè å¸ íåîáõîäèìî çàêðûòü - ýòî
  191. äåëàåòñÿ âûçîâîì CloseLibrary().  Òî æå ñàìîå îòíîñèòñÿ è ê îêíàì, è ê
  192. ýêðàíàì, è ê ôàéëàì, è ìíîãî ê ÷åìó åù¸.  Áèáëèîòåêà èìååò ñ÷¸ò÷èê
  193. îòêðûòèé, è ãàðàíòèðîâàííî õðàíèòñÿ â ïàìÿòè òîëüêî â òîì ñëó÷àå, åñëè
  194. ýòîò ñ÷¸ò÷èê áîëüøå íóëÿ.
  195.  
  196.  
  197.   7) Ñîãëàøåíèÿ î âûçîâå äëÿ Asm è C
  198.  
  199.      Äëÿ âûçîâà ôóíêöèé áèáëèîòåê ïðèíÿòî ïåðåäàâàòü àðãóìåíòû â
  200. ðåãèñòðàõ ïðîöåññîðà.  Óêàçàòåëè îáû÷íî ïåðåäàþòñÿ â ðåãèñòðàõ àäðåñà,
  201. çíà÷åíèÿ îáû÷íî ïåðåäàþòñÿ â ðåãèñòðàõ äàííûõ.  Ïðè ýòîì îáû÷íî
  202. èñïîëüçóþòñÿ ðåãèñòðû àäðåñà íà÷èíàÿ ñ A0 è äàííûõ íà÷èíàÿ ñ D0.
  203. Âîçìîæíû è èñêëþ÷åíèÿ èç ýòîãî ïðàâèëà - òàê, íàïðèìåð, â dos.library
  204. ïðàêòè÷åñêè âñ¸ ïåðåäà¸òñÿ â ðåãèñòðàõ äàííûõ, íà÷èíàÿ ñ D1.
  205.      ×òî è êóäà êîíêðåòíî êëàä¸òñÿ - ñìîòðèòå â àâòîäîêàõ.  Ïîä êàæäûì
  206. àðãóìåíòîì òàì ïðèïèñàí ðåãèñòð, â êîòîðûé íóæíî ïîëîæèòü àðãóìåíò.
  207.      Ðåçóëüòàò, åñëè îí åñòü, âñåãäà âîçâðàùàåòñÿ â ðåãèñòðå D0 - äàæå
  208. â òîì ñëó÷àå, åñëè ýòî óêàçàòåëü.  Åñëè íóæíî âåðíóòü çíà÷åíèÿ
  209. íåñêîëüêèõ ïåðåìåííûõ, îáû÷íî ïåðåäàþò ôóíêöèè ðÿä óêàçàòåëåé íà íèõ.
  210.  
  211.      Áàçó áèáëèîòåêè ïðèíÿòî õðàíèòü â ïåðåìåííîé ñ îïðåäåë¸ííûì
  212. èìåíåì.  Äëÿ Ñè ýòî áóäåò èìÿ òèïà DOSBase, IntuitionBase è ò.ï., à
  213. äëÿ Asm ýòî áóäåò _DOSBase, _IntuitionBase - ê èìåíè ëþáîé ïåðåìåííîé
  214. íà Ñè ñ òî÷êè çðåíèÿ àññåìáëåðà ïðèáàâëÿåòñÿ çíàê ïîä÷¸ðêèâàíèÿ â
  215. íà÷àëå.  Ïîñëå îòêðûòèÿ óêàçàòåëü íà áàçó áèáëèîòåêè êëàä¸òñÿ â ýòó
  216. ïåðåìåííóþ.
  217.      Åñëè âûçîâ ôóíêöèé áèáëèîòåê íà Ñè íè÷åì íå îòëè÷àåòñÿ îò âûçîâà
  218. ëþáûõ ïðî÷èõ ôóíêöèé, òî â ñëó÷àå àññåìáëåðà èìåþòñÿ ñëåäóþùèå
  219. ñîãëàøåíèÿ:
  220.  
  221.      - ïðè âûçîâå ëþáûõ ôóíêöèé, åñëè íå îãîâîðåíî èíîå, â ðåãèñòðå A6
  222.        äîëæåí ëåæàòü óêàçàòåëü íà áàçó áèáëèîòåêè.  Ýòî ñäåëàíî äëÿ
  223.        òîãî, ÷òîáû êîä áèáëèîòåêè ìîã èìåòü äîñòóï ê áàçå.
  224.  
  225.      - âûçîâ ôóíêöèè çàïèñûâàåòñÿ â âèäå jsr _LVOèìÿ_ôóíêöèè(a6).
  226.        Ñóùåñòâóþò òàêæå ìàêðîñû òèïà CALLEXEC, CALLGFX, CALLINT etc,
  227.        êîòîðûå ñàìè èíèöèàëèçèðóþò A6 è äîáàâëÿþò _LVO ê èìåíè.
  228.  
  229.      Â ÿçûêå Ñè ñóùåñòâóþò ôóíêöèè ñ ïåðåìåííûì ÷èñëîì àðãóìåíòîâ.
  230. Ïîñêîëüêó ïðîöåññîðà ñ ïåðåìåííûì ÷èñëîì ðåãèñòðîâ äëÿ ýòîé öåëè íèêòî
  231. ïðèäóìûâàòü íå áóäåò, ïîñòóïàþò ïðîùå - ïåðåäàþò â ðåãèñòðå óêàçàòåëü
  232. íà ìàññèâ ïåðåìåííûõ.  Ñ òî÷êè çðåíèÿ ïðîãðàììèñòà íà àñìå ñóùåñòâóåò
  233. ëèøü îäíà ôóíêöèÿ, ïîëó÷àþùàÿ óêàçàòåëü íà ìàññèâ.  À ñ òî÷êè çðåíèÿ
  234. ïðîãðàììèñòà íà Ñè åñòü äâå ôóíêöèè - óïîìÿíóòàÿ ðàíåå è òàê
  235. íàçûâàåìûé varargs stub.  Ýòî «çàãëóøêà», ïðåäñòàâëÿþùàÿ ñîáîé
  236. ìàëåíüêóþ ôóíêöèþ, ïîëó÷àþùóþ ìàññèâ àðãóìåíòîâ êëàññè÷åñêèì äëÿ Ñè
  237. ñïîñîáîì - íà ñòåêå, è ïåðåäàþùàÿ óêàçàòåëü íà ýòîò ó÷àñòîê ñòåêà
  238. âûçûâàåìîé ôóíêöèè ñèñòåìû.
  239.  
  240.      Â ðÿäå ñëó÷àåâ íåîáõîäèìî ïåðåäàòü ôóíêöèè íåêîå ïîäìíîæåñòâî
  241. àðãóìåíòîâ èç íåêîòîðîãî, äîñòàòî÷íî áîëüøîãî ìíîæåñòâà.  Íàïðèìåð,
  242. êîãäà ìû îòêðûâàåì ýêðàí, ìîæíî íå çàáîòèòüñÿ î ãëóáèíå öâåòà è
  243. âèäåîðåæèìå, ïåðåäàâàÿ àðãóìåíòû Width, Height è Depth, à ïðîñòî
  244. ñêîïèðîâàòü ðåæèì ýêðàíà Workbench.  Äëÿ ýòîãî ðåàëèçîâàí ìåõàíèçì
  245. ÒÝÃΠ(tags).  Tag ïðåäñòàâëÿåò ñîáîé ïàðó 32-áèòíûõ ÷èñåë, ïåðâîå èç
  246. êîòîðûõ ÿâëÿåòñÿ òèïîì, à âòîðîå çíà÷åíèåì.  Taglist, òî åñòü ñïèñîê
  247. òýãîâ, ïðåäñòàâëÿåò ñîáîé ìàññèâ òàêèõ ïàð, çàêàí÷èâàþùèéñÿ íóëåâûì
  248. òèïîì (TAG_END).  Taglist îáû÷íî ïåðåäà¸òñÿ â âèäå íàáîðà ÷èñåë
  249. ôóíêöèÿì ñ ïåðåìåííûì ÷èñëîì àðãóìåíòîâ - ôàêòè÷åñêè ïðè ýòîì áóäåò
  250. ïåðåäàí óêàçàòåëü íà ñôîðìèðîâàííûé çàðàíåå (â ñëó÷àå àññåìáëåðà) èëè
  251. ñôîðìèðîâàííûé «íà ëåòó» íà ñòåêå (â ñëó÷àå Ñè) ìàññèâ.
  252.      Ê ïðèìåðó, åñëè ìû õîòèì îòêðûòü ýêðàí òàêîãî æå ðàçðåøåíèÿ è
  253. âèäåîðåæèìà, êàê ó Workbench, íî ãëóáèíîé â 4 öâåòà, ïèøåì:
  254.  
  255.      OpenScreenTags(NULL, // ñòðóêòóðà íå ïåðåäà¸òñÿ
  256.        SA_LikeWorkbench, TRUE, // ëîãè÷åñêîå çíà÷åíèå
  257.        SA_Depth, 2, // ÷åòûðå öâåòà - äâà áèòïëàíà
  258.      TAG_END);
  259.  
  260.      Íà àññåìáëåðå òî æå ñàìîå ïðåäñòàâëÿåòñÿ â ñëåäóþùåì âèäå:
  261.      ...
  262.      sub.l  a0,a0
  263.      lea    tags,a1
  264.      move.l _IntuitionBase,a6
  265.      jsr    _LVOOpenScreenTagList(a6)
  266.      ...
  267. tags dc.l   SA_LikeWorkbench, TRUE,
  268.      dc.l   SA_Depth, 2,
  269.      dc.l   TAG_END
  270.  
  271.      Òåêñòîâûå ñòðîêè â AmigaOS ñëåäóþò ñîãëàøåíèÿì Ñè - ÿâëÿÿñü
  272. ïîñëåäîâàòåëüíîñòüþ íåíóëåâûõ áàéòîâ, çàêàí÷èâàþùåéñÿ íóë¸ì.
  273.  
  274.      Íåñêîëüêî ñëîâ î ðåçóëüòàòàõ âûïîëíåíèÿ ôóíêöèé.  Êàê ïðàâèëî,
  275. èíäèêàöèåé îøèáêè ÿâëÿåòñÿ íóëü â ðåçóëüòàòå âûïîëíåíèÿ.  Ðåçóëüòàò
  276. íóæíî îáÿçàòåëüíî ïðîâåðÿòü «íà âøèâîñòü», åñëè âûïîëíÿòü ïðîãðàììó
  277. áåçîòíîñèòåëüíî ðåçóëüòàòîâ, òî â íåêîòîðûõ ñëó÷àÿõ îíà ìîæåò «óïàñòü»
  278. ïðè ïîïûòêå èñïîëüçîâàíèÿ íåäîñòóïíûõ â äàííûé ìîìåíò èëè íà äàííîé
  279. êîíôèãóðàöèè ðåñóðñîâ!
  280.  
  281.  
  282.   8) Includes
  283.  
  284.      Includes - ôàéëû òèïà #?.h (äëÿ Ñè) è #?.i (äëÿ àññåìáëåðà)
  285. ñîäåðæàò âñå íåîáõîäèìûå îïðåäåëåíèÿ êîíñòàíò, ñòðóêòóð è ôóíêöèé äëÿ
  286. ðàáîòû ñ AmigaOS.  Îáû÷íî ïðèíÿòî õðàíèòü èõ íà «include:».  Äëÿ
  287. ïîäêëþ÷åíèÿ ëþáîãî èç íèõ èñïîëüçóåòñÿ äèðåêòèâà include àññåìáëåðà
  288. èëè #include ïðåïðîöåññîðà Ñè.
  289.  
  290.      Àññåìáëåð:
  291.  
  292.      Äëÿ ïîëó÷åíèÿ âñåõ ñìåùåíèé ôóíêöèé áèáëèîòåê ïðåäíàçíà÷åíû ôàéëû
  293. ÈìÿÁèáëèîòåêè_lib.i - èìåííî òàì îïðåäåëåíû âñå _LVO (Library Vector
  294. Offsets).  Õðàíÿòñÿ îíè â îòäåëüíûõ äèðåêòîðèÿõ äëÿ áèáëèîòåê (òèïà
  295. include:intuition/) èëè â ñïåöèàëüíîé äèðåêòîðèè include:lvo/.
  296.  
  297.      Ñè:
  298.  
  299.      Çäåñü ÷óòü ñëîæíåå, ïîñêîëüêó ðåàëèçàöèÿ çàâèñèò îò êîìïèëÿòîðà.
  300. Äëÿ SAS/C îïðåäåëåíèÿ ôóíêöèé íàõîäÿòñÿ â include:pragmas/ è
  301. íàçûâàþòñÿ ÈìÿÁèáëèîòåêè_pragmas.h.  Äëÿ Hisoft C îíè ëåæàò â
  302. include:pragma/ è íàçûâàþòñÿ ÈìÿÁèáëèîòåêè_lib.h.  Êðîìå òîãî, äëÿ
  303. SAS/C òðåáóþòñÿ îïðåäåëåíèÿ ïðîòîòèïîâ ôóíêöèé èç include:clib/.
  304.      Åñëè Âàì õî÷åòñÿ, ÷òîáû ïðîãðàììà êîìïèëèðîâàëàñü êàê ïîä SAS/C,
  305. òàê è ïîä Hisoft C, ìîæíî èñïîëüçîâàòü óñëîâíóþ êîìïèëÿöèþ - êàê ýòî
  306. ñäåëàòü, áóäåò ðàññêàçàíî äàëüøå.
  307.  
  308.      Îñòàëüíûå, êðîìå ïåðå÷èñëåííîãî, ñïåöèôè÷íîãî äëÿ ÿçûêà, ôàéëû
  309. ÿâëÿþòñÿ îáùèìè ïî ñìûñëó, ðàçëè÷àÿñü ëèøü èìåíåì #?.h è #?.i.
  310.  
  311.  
  312.   9) Ðàáîòà ñ ïàìÿòüþ
  313.  
  314.      Â îòëè÷èå îò ÁÊ, Ñïåêòðóìà, PC è äðóãèõ îäíîçàäà÷íûõ ìàøèí íà
  315. Àìèãå íå èñïîëüçóþòñÿ àáñîëþòíûå àäðåñà.  Ïðîãðàììà ìîæåò îêàçàòüñÿ
  316. ïðè ñòàðòå ñ ëþáîãî àäðåñà â ïðåäåëàõ äîñòóïíûõ ïðîöåññîðó ÷åòûð¸õ
  317. ãèãàáàéò.  Åäèíñòâåííûé àáñîëþòíûé àäðåñ - ÿ÷åéêà 4.
  318.      Êîãäà äëÿ âûïîëíåíèÿ êàêîé-ëèáî çàäà÷è òðåáóåòñÿ ïàìÿòü, å¸ íóæíî
  319. çàðåçåðâèðîâàòü.  Ýòî äåëàåòñÿ âûçîâàìè Exec.  Êîãäà ðàáîòà ñ ó÷àñòêîì
  320. ïàìÿòè çàêîí÷åíà, åãî íóæíî îñâîáîäèòü.  Ïàìÿòü, â êîòîðîé íàõîäèòñÿ
  321. ñàìà ïðîãðàììà ïðè ñòàðòå, óæå çàðåçåðâèðîâàíà ñèñòåìîé è áóäåò
  322. àâòîìàòè÷åñêè îñâîáîæäåíà ïðè âûõîäå èç ïðîãðàììû.
  323.      Ïàìÿòü íà Àìèãå ìîæåò áûòü ðàçíûõ òèïîâ.  Ïðè ñòàðòå ñèñòåìû
  324. ïðîèñõîäèò ñîñòàâëåíèå ñïèñêà äîñòóïíûõ ó÷àñòêîâ ïàìÿòè, êàæäûé èç
  325. êîòîðûõ èìååò ñâîé ïðèîðèòåò.  Ïðè ðåçåðâèðîâàíèè ïàìÿòè ïðîèñõîäèò
  326. ïðîñìîòð âñåõ ó÷àñòêîâ â ïîðÿäêå óìåíüøåíèÿ ïðèîðèòåòà, è ïàìÿòü
  327. âûäåëÿåòñÿ èç òîãî ó÷àñòêà, â êîòîðîì ïåðâûì áûë íàéäåí òðåáóåìûé
  328. ó÷àñòîê çàäàííîãî ðàçìåðà.  Chip è Fast ïàìÿòü ïðåäñòàâëÿþò ñîáîé
  329. ïðèìåð òàêèõ ó÷àñòêîâ.  Ìîæíî ÿâíî óêàçàòü òèï òðåáóåìîé ïàìÿòè.
  330.      Äëÿ ðåçåðâèðîâàíèÿ ïàìÿòè ó AmigaOS åñòü íåñêîëüêî ñðåäñòâ.
  331. Âûçîâ Exec'à AllocVec() ðåçåðâèðóåò çàäàííîå êîëè÷åñòâî áàéòîâ ïàìÿòè
  332. çàäàííîãî òèïà.  Àðãóìåíòû ýòîé ôóíêöèè - òðåáóåìûé îáú¸ì ïàìÿòè â
  333. áàéòàõ (D0) è òðåáóåìûé òèï ïàìÿòè (D1).  Â ðåçóëüòàòå âîçâðàùàåòñÿ
  334. íà÷àëüíûé àäðåñ çàõâà÷åííîé ïàìÿòè, èëè æå íóëü â ñëó÷àå îøèáêè.
  335. Îáÿçàòåëüíî ïðîâåðÿéòå îøèáêó - ïîïûòêà èñïîëüçîâàòü ïàìÿòü ñ íóëÿ
  336. ïðèâåä¸ò ê êðàõó ñèñòåìû!  Äëÿ òîãî, ÷òîáû îñâîáîäèòü çàõâà÷åííóþ
  337. ïàìÿòü, èñïîëüçóéòå FreeVec(), åäèíñòâåííûì àðãóìåíòîì êîòîðîé
  338. ÿâëÿåòñÿ óêàçàòåëü íà ó÷àñòîê ïàìÿòè (A1).  Exec ñàìîñòîÿòåëüíî
  339. çàïîìèíàåò îáú¸ì çàõâà÷åííîé ïàìÿòè, è îñâîáîæäàåò ðîâíî ñòîëüêî æå.
  340.      Àòðèáóòû îïðåäåëÿþò òèï òðåáóåìîé ïàìÿòè è íåêîòîðûå îïöèè.  Îíè
  341. ïîäðîáíî îïèñàíû â àâòîäîêàõ (exec.library/AllocMem() - óñòàðåâøàÿ
  342. ôóíêöèÿ çàõâàòà ó÷àñòêà ïàìÿòè, íå çàïîìèíàþùàÿ åãî ðàçìåð).  Îòìåòèì
  343. ëèøü äâå èç íèõ:  MEMF_CHIP äîëæåí áûòü ÎÁßÇÀÒÅËÜÍΠóñòàíîâëåí, åñëè ê
  344. çàõâà÷åííîé ïàìÿòè áóäåò èäòè îáðàùåíèå ÷èïñåòà (íàïðèìåð, òàì áóäåò
  345. êàðòèíêà, ïåðåñûëàåìàÿ áëèòòåðîì íà ýêðàí), è MEMF_CLEAR îçíà÷àåò, ÷òî
  346. âñÿ çàðåçåðâèðîâàííàÿ ïàìÿòü áóäåò îáíóëåíà (â ïðîòèâíîì ñëó÷àå òàì
  347. áóäóò ñëó÷àéíûå çíà÷åíèÿ, îñòàâøèåñÿ îò ïðåäûäóùåãî «õîçÿèíà» ýòîé
  348. ïàìÿòè).  Íóëü (MEMF_ANY) îçíà÷àåò îòñòóòñòâèå òðåáîâàíèé ê ïàìÿòè.
  349.  
  350.      Åñòü áîëåå ïðîñòîé ñïîñîá ðàáîòû ñ ïàìÿòüþ.  Åñëè ïðîãðàììå âñ¸
  351. âðåìÿ å¸ ðàáîòû íóæåí ó÷àñòîê ïàìÿòè çàäàííîãî ðàçìåðà, è äèíàìè÷åñêè
  352. çàõâàòûâàòü è îñâîáîæäàòü ïàìÿòü íå íóæíî, ìîæíî ïðîñòî óêàçàòü
  353. ñëåäóþùåå:
  354.  
  355.       section xxxx,bss
  356. label ds.b ...
  357.  
  358.      Ñåêöèÿ äàííûõ òàêîãî âèäà îçíà÷àåò, ÷òî ïðè ñòàðòå ïðîãðàììû ýòà
  359. ïàìÿòü áóäåò àâòîìàòè÷åñêè çàðåçåðâèðîâàíà ñèñòåìîé, à ïðè çàâåðøåíèè
  360. ïðîãðàììû - àâòîìàòè÷åñêè îñâîáîæäåíà.  Â èñïîëíÿåìîì ôàéëå îíà íå
  361. áóäåò çàíèìàòü ìåñòà, ðåçåðâèðîâàíèå ìåãàáàéòà âîâñå íå îçíà÷àåò, ÷òî
  362. èñïîëíÿåìûé ôàéë óâåëè÷èòñÿ íà ìåãàáàéò.  Åñëè óêàçàòü òèï ñåêöèè êàê
  363. bss_c, ýòî àíàëîãè÷íî AllocVec ñ àòðèáóòîì MEMF_CHIP.
  364.      Ðàçìåùàòü äàííûå â ñåêöèè òèïà bss íåëüçÿ, çäåñü ïðèìåíèìû òîëüêî
  365. êîìàíäû ðåçåðâèðîâàíèÿ ïàìÿòè ds.b, ds.w è ds.l.
  366.  
  367.      Íà Ñè äëÿ òîé æå öåëè èñïîëüçóþòñÿ static-ìàññèâû.  Â ñëó÷àå
  368. SAS/C ñòîèò óêàçàòü êëþ÷åâîå ñëîâî __far, èíà÷å â íåêîòîðûõ ñëó÷àÿõ
  369. èñïîëíÿåìûé êîä ïðîãðàììû ðàçáóõíåò îò íåêîòîðîãî êîëè÷åñòâà íóëåé.
  370.  
  371.      Äëÿ ïîëó÷åíèÿ èíôîðìàöèè îá îáú¸ìå ñâîáîäíîé ïàìÿòè èñïîëüçóåòñÿ
  372. ôóíêöèÿ AvailMem(). Å¸ àðãóìåíò (D1) - àòðèáóòû ïàìÿòè. Òàêèì îáðàçîì
  373. ìîæíî ïîëó÷èòü îáú¸ì ñâîáîäíîé chip-ïàìÿòè (MEMF_CHIP), fast-ïàìÿòè,
  374. ïàìÿòè âîîáùå (MEMF_ANY), íàèáîëüøåãî íåïðåðûâíîãî ñâîáîäíîãî êóñêà
  375. (MEMF_LARGEST).  Ïîñêîëüêó ó íàñ ìíîãîçàäà÷íàÿ ÎÑ, ñâåäåíèÿ îá îáú¸ìå
  376. ïàìÿòè ê ìîìåíòó èõ èñïîëüçîâàíèÿ ìîãóò óñòàðåòü :-)
  377.  
  378.      Äëÿ ïîëó÷åíèÿ èíôîðìàöèè î òèïå ïàìÿòè, óêàçàòåëü íà êîòîðóþ
  379. èìååòñÿ, èñïîëüçóåòñÿ ôóíêöèÿ TypeOfMem().  Åé ïåðåäà¸òñÿ óêàçàòåëü
  380. (A1), à ðåçóëüòàòîì ÿâëÿþòñÿ èñêîìûå àòðèáóòû.  Åñëè ôóíêöèÿ ïîëó÷èëà
  381. óêàçàòåëü, íå ïîïàäàþùèé â ïðåäåëû äîñòóïíûõ îáëàñòåé ïàìÿòè, îíà
  382. âåðí¸ò íóëü.
  383.  
  384.  
  385.  10) Ôðàãìåíòàöèÿ ïàìÿòè
  386.  
  387.      Ôðàãìåíòàöèÿ ïàìÿòè íåèçáåæíî âîçíèêàåò, ïîñêîëüêó ðåçåðâèðóåìûå
  388. ó÷àñòêè ïàìÿòè ìîãóò áûòü òîëüêî íåïðåðûâíûìè.  Ðàíî èëè ïîçäíî ìîæåò
  389. îáíàðóæèòñÿ òàêàÿ ñèòóàöèÿ, ÷òî âðîäå áû ïàìÿòè è äîñòàòî÷íî, à
  390. íåïðåðûâíûé ó÷àñòîê òðåáóåìîãî ðàçìåðà íàéòè íå óäà¸òñÿ.  Ñ ýòèì
  391. ÿâëåíèåì ìîæíî è íóæíî áîðîòüñÿ ñëåäóþùèìè ñðåäñòâàìè:
  392.      1. Åñëè òðåáóåòñÿ îïðåäåë¸ííûé îáú¸ì ïàìÿòè äëÿ ðàáîòû
  393. ïðîãðàììû, ëó÷øå âìåñòî îäíîãî áîëüøîãî ó÷àñòêà ïàìÿòè çàõâàòèòü
  394. íåñêîëüêî ìàëåíüêèõ.
  395.      2. Ïî âîçìîæíîñòè èçáåãàéòå äèíàìè÷åñêîé ðàáîòû ñ ïàìÿòüþ.  Åñëè
  396. îáú¸ì òðåáóåìîé ïàìÿòè íåâåëèê, ëó÷øå ðàáîòàòü ñ bss ñåêöèÿìè.
  397. Äèíàìè÷åñêàÿ ðàáîòà ñ ïàìÿòüþ îïðàâäàíà òîëüêî â òîì ñëó÷àå, åñëè
  398. òðåáóåìûå îáú¸ìû ïàìÿòè äîñòàòî÷íî âåëèêè, è áîëüøîé îáú¸ì ïàìÿòè
  399. ìîæåò çíà÷èòåëüíî óâåëè÷èòü ïðîèçâîäèòåëüíîñòü ðàáîòû.  Åñëè æå
  400. òðåáóåòñÿ 100-200 áàéò, òî äàæå òàêîé ó÷àñòîê, îêàçàâøèñü âîëåé ñëó÷àÿ
  401. ïîñðåäè 16-ìåãàáàéòíîãî ïðîñòðàíñòâà, ìîæåò îñëîæíèòü æèçíü äðóãèì
  402. ïðîãðàììàì...
  403.      3. Íà÷èíàÿ ñ âåðñèè 39 îïåðàöèîííîé ñèñòåìû (kickstart 3.0) åñòü
  404. íîâûé ìåòîä ðàáîòû ñ ïàìÿòüþ - Memory Pools.  Èñïîëüçîâàíèå ýòîãî
  405. ìåòîäà ïîçâîëèò èçáåæàòü ñèëüíîé ôðàãìåíòàöèè ïàìÿòè, åñëè
  406. èñïîëüçîâàíèå äèíàìè÷åñêîé ðàáîòû ñ ïàìÿòüþ íåîáõîäèìî.  Ôðàãìåíòàöèè
  407. ïðàêòè÷åñêè íå áóäåò äàæå ïðè èñïîëüçîâàíèè áîëüøèõ îáú¸ìîâ ïàìÿòè èç
  408. ìíîæåñòâà ìàëåíüêèõ áëîêîâ.  Ñóòü ìåòîäà â òîì, ÷òî ñèñòåìà
  409. àâòîìàòè÷åñêè ïî íåîáõîäèìîñòè ðåçåðâèðóåò áëîêè ïàìÿòè îäèíàêîâîãî
  410. çàäàííîãî îáú¸ìà, à òðåáóåìûå áëîêè ëþáîãî ðàçìåðà âûäåëÿþòñÿ óæå êàê
  411. áû «âíóòðè» ýòèõ áëîêîâ.  Êîãäà ïàìÿòü âíóòðè îäíîãî èç áëîêîâ
  412. ôèêñèðîâàííîãî îáú¸ìà êîí÷àåòñÿ, ñèñòåìà àâòîìàòè÷åñêè çàõâàòûâàåò
  413. íîâûé.  Ñîîòâåòñòâåííî, åñëè âíóòðè áëîêà îñâîáîæäàåòñÿ ïîñëåäíèé èç
  414. áëîêîâ ïðîèçâîëüíîãî ðàçìåðà, îí àâòîìàòè÷åñêè îñâîáîæäàåòñÿ.  Íàáîð
  415. áëîêîâ çàäàííîãî ðàçìåðà îáðàçóåò Memory Pool.
  416.      Äëÿ ñîçäàíèÿ Memory Pool èñïîëüçóåòñÿ ôóíêöèÿ Exec CreatePool.
  417. Ÿ àðãóìåíòû - àòðèáóòû ïàìÿòè, êîòîðàÿ áóäåò ðåçåðâèðîâàòüñÿ ó
  418. ñèñòåìû (D0 - òàêèå æå, êàê è ó AllocVec), ðàçìåð ôèêñèðîâàííîãî áëîêà
  419. ïàìÿòè, èç êîòîðûõ è áóäåò ñîñòàâëÿòüñÿ Pool (D1) è ìèíèìàëüíûé îáú¸ì
  420. ïàìÿòè, ïðè ïðåâûøåíèè êîòîðîãî çàõâàòûâàåìûå ó÷àñòêè ïàìÿòè áóäóò
  421. ðàçìåùàòüñÿ íå â áëîêàõ çàäàííîãî ðàçìåðà âìåñòå ñ îñòàëüíûìè
  422. ó÷àñòêàìè, à â ñâîèõ ñîáñòâåííûõ áëîêàõ (D2).  Ýòîò îáú¸ì äîëæåí áûòü
  423. ÌÅÍÜØÅ ÈËÈ ÐÀÂÅÍ îáú¸ìó áëîêà ôèêñèðîâàííîãî ðàçìåðà.
  424.      CreatePool âîçâðàùàåò  óêàçàòåëü íà çàãîëîâîã Pool'à, ëèáî
  425. íóëü â ñëó÷àå îøèáêè.  Äëÿ òîãî, ÷òîáû çàõâàòèòü ó÷àñòîê ïàìÿòè
  426. ïðîèçâîëüíîãî ðàçìåðà, íóæíî âîñïîëüçîâàòüñÿ ôóíêöèåé AllocPooled.
  427. Åé ïåðåäà¸òñÿ çàãîëîâîê Pool'à (A0) è îáú¸ì òðåáóåìîé ïàìÿòè (D0).
  428. Ýòà ôóíêöèÿ íå çàïîìèíàåò îáú¸ì çàòðåáîâàííîé ïàìÿòè, êàê AllocVec,
  429. ïîýòîìó åãî íóæíî çàïîìèíàòü ñàìîñòîÿòåëüíî (â autodocs ïðèâåä¸í
  430. èñõîäíûé òåêñò ôóíêöèè AllocVecPooled, ðàáîòàþùåé àíàëîãè÷íî
  431. AllocVec).
  432.      Îñâîáîäèòü çàíèìàåìóþ ïàìÿòü ìîæíî òîæå «ïî êóñî÷êàì» ñ ïîìîùüþ
  433. FreePooled.  Îíà ïîëó÷àåò óêàçàòåëü íà çàãîëîâîê Pool'à (A0), àäðåñ
  434. îñâîáîæäàåìîãî ó÷àñòêà (A1) è åãî äëèíó â áàéòàõ (D0).  Òàê æå êàê è â
  435. ñëó÷àå FreeVec, ìîæíî âîñïîëüçîâàòüñÿ ñîáñòâåííîé ôóíêöèåé
  436. FreeVecPooled, èñõîäíèê êîòîðîé ïðèâåä¸í â autodocs.
  437.      Ôóíêöèÿ DeletePool óíè÷òîæàåò Memory Pool, àäðåñ çàãîëîâêà
  438. êîòîðîãî åé ïåðåäàí (A0).  Çàðåçåðâèðîâàííûå â ýòîì Pool'å ó÷àñòêè
  439. ïàìÿòè îñâîáîæäàòü íå íóæíî - ýòî áóäåò ñäåëàíî àâòîìàòè÷åñêè.
  440.  
  441.  
  442.  11) Ñïèñêè
  443.  
  444.      Ñïèñêè èñïîëüçóþòñÿ â ÎÑ ïîâñåìåñòíî êàê ìåõàíèçì õðàíåíèÿ íàáîðà
  445. êàêèõ-ëèáî îáúåêòîâ.  Íàïðèìåð, â ñïèñêè îðãàíèçóþòñÿ ó÷àñòêè
  446. ñâîáîäíîé ïàìÿòè è áèáëèîòåêè.  Ýëåìåíò ñïèñêà - ñòðóêòóðà äàííûõ Node
  447. <exec/nodes.#?>, ñîäåðæàùàÿ ñëåäóþùèå ïîëÿ:
  448.  
  449.      ln_Succ - óêàçàòåëü íà ñëåäóþùèé ýëåìåíò ñïèñêà
  450.      ln_Pred - óêàçàòåëü íà ïðåäûäóùèé ýëåìåíò
  451.      ln_Type - òèï ýëåìåíòà
  452.      ln_Pri - ïðèîðèòåò (äëÿ ñîðòèðîâêè)
  453.      ln_Name - óêàçàòåëü íà èìÿ ýëåìåíòà
  454.  
  455.      Åñëè òàêèå íàâîðîòû íå òðåáóþòñÿ, èñïîëüçóåòñÿ ñòðóêòóðà MinNode,
  456. ñîäåðæàùàÿ òîëüêî ïåðâûå äâà îïèñàííûõ ïîëÿ.  Òàêèì îáðàçîì, ýòî
  457. äâóñâÿçíûå ñïèñêè - ò.å., ïî ñïèñêó ìîæíî «äâèãàòüñÿ» â îáå ñòîðîíû.
  458.      Ñàì ñïèñîê îïèñûâàåòñÿ ñòðóêòóðàìè List/MinList <exec/lists.#?>.
  459.  
  460.      Äëÿ ðàáîòû ñî ñïèñêàìè â Exec åñòü íàáîð ïîëåçíûõ ôóíêöèé:
  461.  
  462.      AddHead() - äîáàâëåíèå ýëåìåíòà â íà÷àëî ñïèñêà
  463.      RemHead() - óäàëåíèå ýëåìåíòà èç íà÷àëà ñïèñêà
  464.      AddTail() - äîáàâëåíèå â êîíåö ñïèñêà
  465.      RemTail() - óäàëåíèå èç êîíöà ñïèñêà
  466.      Remove()  - óäàëåíèå çàäàííîãî ýëåìåíòà èç ñïèñêà
  467.  
  468.      Enqueue() ïðåäíàçíà÷åíà äëÿ äîáàâëåíèÿ ýëåìåíòà â î÷åðåäü, è
  469. âñåãäà ñîõðàíÿåò ýëåìåíòû ñïèñêà â ïîðÿäêå ïðèîðèòåòîâ. FindName()
  470. ïðîâîäèò ïîèñê èìåíîâàííîãî ýëåìåíòà ñïèñêà.
  471. Ðàçóìååòñÿ, ýòè ôóíêöèè íå áóäóò ðàáîòàòü ñ MinNode/MinList.
  472.  
  473.      Âñå ïåðå÷èñëåííûå ôóíêöèè ïðåäïîëàãàþò, ÷òî àðáèòðàæ äîñòóïà ñî
  474. ñòîðîíû ðàçíûõ çàäà÷ ê ñïèñêàì âåä¸òñÿ çàäà÷åé ñàìîñòîÿòåëüíî (ñì.
  475. íèæå î ñåìàôîðàõ).
  476.  
  477.  
  478.  
  479.  12) Çàäà÷è
  480.  
  481.      Çàäà÷è (Tasks) ÿâëÿþòñÿ îñíîâíîé ïðîãðàììíîé åäèíèöåé AmigaOS.
  482. Ëþáàÿ çàïóùåííàÿ â äàííûé ìîìåíò ïðîãðàììà ÿâëÿåòñÿ çàäà÷åé.  Êðîìå
  483. òîãî, çàäà÷è ìîãóò ñîçäàâàòü íîâûå çàäà÷è äëÿ ðåàëèçàöèè ñâîèõ
  484. ñîáñòâåííûõ öåëåé.
  485.      Ó êàæäîé çàäà÷è ìîæåò áûòü òðè ñîñòîÿíèÿ - âûïîëíÿåìàÿ (RUN),
  486. ãîòîâàÿ ê âûïîëíåíèþ (READY) è ñîñòîÿíèå îæèäàíèÿ (WAIT).  Î÷åâèäíî,
  487. ïðîöåññîð ìîæåò â äàííûé ìîìåíò ôèçè÷åñêè âûïîëíÿòü òîëüêî îäèí êîä,
  488. ïîýòîìó â êàæäûé êîíêðåòíûé ìîìåíò òîëüêî îäíà çàäà÷à èìååò ñòàòóñ
  489. âûïîëíÿåìîé.  Ó êàæäîé çàäà÷è åñòü ñâîé ïðèîðèòåò - áàéò ñî çíàêîì.
  490. Äëÿ îïðåäåëåíèÿ ïîðÿäêà âûïîëíåíèÿ çàäà÷ îïåðàöèîííàÿ ñèñòåìà
  491. ñîðòèðóåò èõ ñïèñîê ïî ïðèîðèòåòàì, è çàäà÷à ñ íàèâûñøèì ïðèîðèòåòîì,
  492. ãîòîâàÿ ê âûïîëíåíèþ, âûïîëíÿåòñÿ ïåðâîé.  Óïðàâëåíèå ìîæåò áûòü
  493. ïåðåäàíî äðóãîé çàäà÷å â òð¸õ ñëó÷àÿõ: åñëè âûïîëíÿþùàÿñÿ çàäà÷à
  494. ïåðåøëà â ñîñòîÿíèå îæèäàíèÿ, åñëè çàäà÷à ñ áîëüøèì ïðèîðèòåòîì
  495. ïåðåøëà â ñîñòîÿíèå ãîòîâíîñòè, è åñëè ïðè íàëè÷èè ãîòîâîé ê
  496. âûïîëíåíèþ çàäà÷è ñ òàêèì æå ïðèîðèòåòîì ó ðàññìàòðèâàåìîé çàäà÷è
  497. êîí÷èëîñü âðåìÿ.  Åñëè ãîòîâûõ ê âûïîëíåíèþ çàäà÷ ñ îäèíàêîâûì
  498. ïðèîðèòåòîì íåñêîëüêî, ïðîöåññîð áóäåò «îáåãàòü» èõ ïî î÷åðåäè - òàê
  499. ðåàëèçóåòñÿ ðàçäåëåíèå âðåìåíè, ïîçâîëÿþùåå îäíîâðåìåííî ðàáîòàòü
  500. íåñêîëüêèì çàäà÷àì âû÷èñëèòåëüíîãî õàðàêòåðà.
  501.  
  502.      Êàæäàÿ çàäà÷à èìååò ñòðóêòóòó Task <exec/tasks.#?>, â
  503. êîòîðîé õðàíÿòñÿ å¸ ñâîéñòâà - ïðèîðèòåò, èìÿ è ïðî÷åå.  Óêàçàòåëü íà
  504. Task ìîæíî ïîëó÷èòü ñ ïîìîùüþ ôóíêöèè FindTask(), ïåðåäàâ åé óêàçàòåëü
  505. (A1) íà èìÿ çàäà÷è.  Åñëè çàäà÷å íóæåí óêàçàòåëü íà ñîáñòâåííóþ
  506. ñòðóêòóðó, èñïîëíÿåòñÿ FindTask() ñ íóëåâûì àðãóìåíòîì.  Çíàíèå àäðåñà
  507. ñòðóêòóðû Task íåîáõîäèìî äëÿ ìåæçàäà÷íûõ êîììóíèêàöèé.
  508.  
  509.      Êîãäà ýòî íåîáõîäèìî, çàäà÷à ìîæåò ñîçäàòü ëþáîå êîëè÷åñòâî
  510. íóæíûõ åé ïîäçàäà÷.  Ôóíêöèÿ CreateNewProc() èç dos.library ñîçäà¸ò
  511. íîâóþ çàäà÷ó, âûïîëíÿÿ êîä Âàøåé æå çàäà÷è.  Åé ïåðåäà¸òñÿ taglist,
  512. ñîäåðæàùèé òýã NP_Entry - óêàçàòåëü íà âûïîëíÿåìóþ ôóíêöèþ.  Çàäà÷à
  513. íà÷èíàåò âûïîëíÿòüñÿ íåìåäëåííî, à ôóíêöèÿ âîçâðàùàåò óêàçàòåëü íà
  514. ñòðóêòóðó Task (åñëè áûòü ïðåäåëüíî òî÷íûì, âîçâðàùàåòñÿ ñòðóêòóðà
  515. Process, ñîäåðæàùàÿ ïåðâûì ýëåìåíòîì ñòðóêòóðó Task - íî îá ýòîì
  516. ïîçæå).  Çàäà÷à çàâåðøàåòñÿ âîçâðàòîì èç ôóíêöèè (rts) è àâòîìàòè÷åñêè
  517. óíè÷òîæàåòñÿ.
  518.      Èìåéòå â âèäó, ÷òî ê ìîìåíòó âûõîäà èç Âàøåé ïðîãðàììû âñå
  519. ïîäçàäà÷è äîëæíû áûòü çàâåðøåíû!  Â ïðîòèâíîì ñëó÷àå ïîñëåäóþùàÿ
  520. ðàáîòîñïîñîáíîñòü ñèñòåìû íå ãàðàíòèðóåòñÿ.
  521.  
  522.  
  523.  13) Ñèãíàëû
  524.  
  525.      Êàê óïîìèíàëîñü ðàíåå, çàäà÷à ìîæåò íàõîäèòüñÿ â ñîñòîÿíèè
  526. îæèäàíèÿ.  Â ýòî ñîñòîÿíèå çàäà÷è âõîäÿò äëÿ îæèäàíèÿ êàêèõ-ëèáî
  527. âíåøíèõ (äëÿ ýòîé çàäà÷è) ñîáûòèé, êîòîðûå ìîãóò áûòü èíèöèèðîâàíû êàê
  528. äðóãèìè çàäà÷àìè, òàê è ïåðèôåðèåé êîìüþòåðà.  Ñèãíàëû èñïîëüçóþòñÿ
  529. äëÿ âçàèìîäåéñòâèÿ çàäà÷, ýòî ïðîñòåéøèé òèï èõ âçàèìîäåéñòâèÿ, íà
  530. êîòîðîì ïîñòðîåíû âñå îñòàëüíûå.  Â ÷àñòíîñòè, ñèãíàëû èñïîëüçóþòñÿ
  531. äëÿ òîãî, ÷òîáû âûâåñòè çàäà÷ó èç ñîñòîÿíèÿ îæèäàíèÿ.
  532.      Ëþáàÿ çàäà÷à ìîæåò ïîñëàòü ëþáîé ñèãíàë ëþáîé çàäà÷å.  Äëÿ ýòîãî
  533. èñïîëüçóåòñÿ ôóíêöèÿ Exec'à Signal(), àðãóìåíòàìè êîòîðîé ñëóæàò
  534. óêàçàòåëü íà ñòðóêòóðó Task çàäà÷è-«ïðè¸ìíèêà», êîòîðîé ïîñûëàåòñÿ
  535. ñèãíàë (A1) è ìàñêà ñèãíàëîâ (D0).  Ïðè ýòîì íå èìååò çíà÷åíèÿ, â
  536. êàêîì ñîñòîÿíèè íàõîäèòñÿ ïðèíèìàþùàÿ ñèãíàë çàäà÷à.  Åñëè çàäà÷à
  537. íàõîäèòñÿ â ñîñòîÿíèè îæèäàíèÿ ýòîãî ñèãíàëà, îíà ïåðåõîäèò â
  538. ñîñòîÿíèå ãîòîâíîñòè ê âûïîëíåíèþ.  Åñëè ñèãíàë ïîäàí çàäà÷å,
  539. íàõîäÿùåéñÿ â ñîñòîÿíèè ãîòîâíîñòè, îí áóäåò çàïîìíåí, è ïðè ïåðåõîäå
  540. â ñîñòîÿíèå îæèäàíèÿ çàäà÷à îñòàíåòñÿ â ñîñòîÿíèè ãîòîâíîñòè.
  541.      Ñèãíàë ïðåäñòàâëÿåò ñîáîé îäèí èç áèòîâ 32-áèòíîãî ñëîâà.
  542. Îäíîâðåìåííî ìîæíî ïîñëàòü êàê îäèí, òàê è íåñêîëüêî ñèãíàëîâ -
  543. óñòàíîâèâ ñîîòâåòñòâóþùèå áèòû.  Òî÷íî òàê æå ëþáàÿ çàäà÷à ìîæåò
  544. îæèäàòü êàê îäèí, òàê è íåñêîëüêî ñèãíàëîâ.  Ïåðåõîä èç ñîñòîÿíèÿ
  545. îæèäàíèÿ â ñîñòîÿíèå ãîòîâíîñòè ïðîèñõîäèò òîëüêî ëèøü â òîì ñëó÷àå,
  546. êîãäà ïðèõîäèò õîòÿ áû îäèí èç îæèäàåìûõ ñèãíàëîâ - åñëè íè îäèí èç
  547. áèòîâ îæèäàåìûõ íå ñîîòâåòñòâóåò ïðèøåäøåìó, çàäà÷à íå ïåðåéä¸ò â
  548. ñîñòîÿíèå ãîòîâíîñòè (îäíàêî, ñèãíàë áóäåò çàïîìíåí!).  Êîãäà çàäà÷à
  549. ïåðåøëà â ñîñòîÿíèå ãîòîâíîñòè, îíà ìîæåò ïðîàíàëèçèðîâàòü, êàêèå
  550. èìåííî ñèãíàëû åé ïîëó÷åíû, è íà îñíîâàíèè ýòîãî ñäåëàòü âûâîäû, êòî
  551. êîíêðåòíî è ÷òî îò íåå õî÷åò.  Äëÿ òîãî, ÷òîáû âûÿñíèòü, ïðèõîäèë ëè
  552. çà âðåìÿ ðàáîòû çàäà÷è ñèãíàë, åé íå îáÿçàòåëüíî ïåðåõîäèòü â
  553. ñîñòîÿíèå îæèäàíèÿ - ñèñòåìà äà¸ò âîçìîæíîñòü ïðî÷èòàòü òåêóùåå
  554. ñîñòîÿíèå ñèãíàëîâ.  Äëÿ ýòîãî èñïîëüçóåòñÿ ôóíêöèÿ dos.library
  555. CheckSignal(), àðãóìåíòîì êîòîðîé (D1) ñëóæèò ìàñêà ïðîâåðÿåìûõ
  556. ñèãíàëîâ, à ðåçóëüòàòîì - ñèãíàëû, óñòàíîâëåííûå íà äàííûé ìîìåíò.
  557. Âñå óêàçàííûå ôóíêöèè ñèãíàëû áóäóò ñáðîøåíû.
  558.      Ñèãíàëû èñïîëüçóþòñÿ, íàïðèìåð, äëÿ îáðàáîòêè íàæàòèÿ êëàâèø
  559. CTRL/C - åñëè âî âðåìÿ ðàáîòû ïðîãðàììû â Shell íàæàòü CTRL/C, çàäà÷å
  560. áóäåò ïîñëàí ñîîòâåòñòâóþùèé ñèãíàë.  Îáðàáàòûâàòü åãî èëè íåò - ýòî
  561. óæå äåëî ñàìîé çàäà÷è.  Ïîñêîëüêó êîëè÷åñòâî ñèãíàëîâ îãðàíè÷åíî,
  562. íåêîòîðûå èç íèõ èìåþò ñïåöèàëüíîå ñëóæåáíîå íàçíà÷åíèå.  Ñèãíàëû 12,
  563. 13, 14, 15 (òî åñòü áèòû ïî ìàñêå f000) ñîîòâåòñòâóþò íàæàòèþ
  564. êîìáèíàöèé êëàâèø CTRL+C,D,E,F.  Îñòàëüíûå (0-11) èñïîëüçóþòñÿ
  565. ñèñòåìîé äëÿ âíóòðåííèõ íóæä.  Äëÿ ñâîèõ öåëåé çàäà÷è ìîãóò
  566. èñïîëüçîâàòü ñèãíàëû íà÷èíàÿ ñ 16-ãî.
  567.      Ïîñêîëüêó çàäà÷à ìîæåò ðàáîòàòü êàê áû â ðàìêàõ äðóãîé çàäà÷è
  568. (ýòî íàçûâàåòñÿ «ðàáîòàòü â êîíòåêñòå âûçûâàþùåé çàäà÷è» - òàê,
  569. íàïðèìåð, shell çàïóñêàåò ïðîãðàììû), íåêîòîðûå ñèãíàëû ê ìîìåíòó
  570. çàïóñêà çàäà÷è ìîãóò áûòü óæå çàíÿòû.  Äëÿ òîãî, ÷òîáû èñïîëüçîâàòü
  571. òîëüêî íåçàíÿòûå ñèãíàëû, Exec ïðåäîñòàâëÿåò âîçìîæíîñòü äèíàìè÷åñêîãî
  572. ðåçåðâèðîâàíèÿ ñèãíàëîâ.  Ê ïðèìåðó, åñëè Âàøà çàäà÷à õî÷åò ïîëó÷àòü
  573. îò êîãî-ëèáî ñèãíàë, îíà äîëæíà âûçâàòü ôóíêöèþ Exec'à AllocSignal.  Â
  574. êà÷åñòâå àðãóìåíòà (D0) ïåðåäà¸òñÿ áàéò -1, è â ðåçóëüòàòå
  575. âîçâðàùàåòñÿ íîìåð ñèãíàëà, ëèáî -1, åñëè ñâîáîäíûõ ñèãíàëîâ íåò.
  576. Ïîëó÷åííîå ÷èñëî íóæíî çàïîìíèòü.  Äëÿ ïîëó÷åíèÿ áèòîâîé ìàñêè ñèãíàëà
  577. èñïîëüçóéòå ýòî ÷èñëî êàê àðãóìåíò ñäâèãà åäèíèöû âëåâî.
  578.      Ýòà æå ôóíêöèÿ èñïîëüçóåòñÿ ñèñòåìíûìè ôóíêöèÿìè äëÿ ðàáîòû ñ
  579. ñèãíàëàìè, ÷òî ïîçâîëÿåò èçáåæàòü êîíôëèêòîâ ñ óæå èñïîëüçóåìûìè
  580. çàäà÷åé ñèãíàëàìè.
  581.      Ïåðåä âûõîäîì èç çàäà÷è çàðåçåðâèðîâàííûé ñèãíàë íåîáõîäèìî
  582. îñâîáîäèòü!  Ýòî äåëàåò FreeSignal(), ïîëó÷àþùåé (D0) íîìåð ñèãíàëà.
  583.      Äëÿ ïåðåõîäà çàäà÷è â ñîñòîÿíèå îæèäàíèÿ âûçûâàåòñÿ ôóíêöèÿ
  584. Wait() - àðãóìåíòîì êîòîðîé (D0) ÿâëÿåòñÿ áèòîâàÿ ìàñêà îæèäàåìûõ
  585. ñèãíàëîâ.  Çàäà÷à ïåðåéä¸ò â ñîñòîÿíèå ãîòîâíîñòè ïîñëå ïîëó÷åíèÿ
  586. ñèãíàëîâ, õîòÿ áû îäèí èç êîòîðûõ ñîâïàä¸ò ñ îæèäàåìûì (èëè ñðàçó æå,
  587. åñëè ýòè ñèãíàëû áûëè óæå ïîñëàíû ðàíåå).
  588.      «Èçíóòðè» ñèãíàëû óñòðîåíû ïðîñòî - ó êàæäîé çàäà÷è åñòü
  589. ñëóæåáíàÿ ñòðóêòóðà, â êîòîðîé îäíî èç ñëîâ ñëóæèò äëÿ çàïîìèíàíèÿ
  590. ñèãíàëîâ.  Êîãäà ýòîé çàäà÷å ïîñûëàåòñÿ ñèãíàë, ñîîòâåòñòâóþùèé åìó
  591. áèò óñòàíàâëèâàåòñÿ â ýòîì ñëîâå.  Åñëè óñòàíîâëåííûå â ðåçóëüòàòå
  592. áèòû ñîâïàäàþò õîòÿ áû ñ îäíèì èç îæèäàåìûõ çàäà÷åé ñèãíàëîâ, îíà
  593. ïåðåõîäèò â ñîñòîÿíèå ãîòîâíîñòè ê âûïîëíåíèþ.  Åñëè çàäà÷à áûëà
  594. ãîòîâà ê âûïîëíåíèþ, ýòè áèòû ïðîñòî çàïîìèíàþòñÿ.  Ïîëó÷åíèå æå
  595. ñèãíàëà ñáðàñûâàåò ñîîòâåòñòâóþùèé åìó áèò, è äåëàåò çàäà÷ó ãîòîâîé ê
  596. ïîâòîðíîìó ïðè¸ìó ñèãíàëà.
  597.      Åñëè çàäà÷à ïîëó÷àåò íåñêîëüêî ñèãíàëîâ ïîäðÿä, îíà çàïîìèíàåò
  598. òîëüêî îäèí.  Äëÿ òîãî, ÷òîáû çàïîìíèòü ñåðèþ îáðàùåíèé îò çàäà÷è ê
  599. çàäà÷å, èñïîëüçóþòñÿ ñîîáùåíèÿ (messages).
  600.  
  601.      Ñóùåñòâóåò âîçìîæíîñòü âûçîâà ïîëüçîâàòåëüñêîé ôóíêöèè â
  602. êîíòåêñòå çàäà÷è â ñëó÷àå ïîëó÷åíèÿ çàäàííîãî íàáîðà ñèãíàëîâ.
  603. Ôóíêöèÿ SetExcept() ïîçâîëÿåò îïðåäåëèòü óñëîâèÿ âîçíèêíîâåíèÿ ýòîé
  604. ñèòóàöèè, à â ïîëå tc_ExceptCode ñòðóêòóðû Task çàäà÷è äîëæåí áûòü
  605. ïðîïèñàí óêàçàòåëü íà âûçûâàåìóþ ôóíêöèþ.  Áîëåå ïîäðîáíî ÷èòàéòå â
  606. exec.doc.
  607.  
  608.  
  609.  14) Ñîîáùåíèÿ
  610.  
  611.      Ñîîáùåíèÿ èñïîëüçóþòñÿ â òåõ ñëó÷àÿõ, êîãäà çàäà÷ó íóæíî íå
  612. ïðîñòî ïðîèíôîðìèðîâàòü î ôàêòå ñîáûòèÿ, íî è ïåðåäàòü êàêóþ-ëèáî
  613. èíôîðìàöèþ.  Êðîìå òîãî, ñîîáùåíèÿ âûñòðàèâàþòñÿ â î÷åðåäü, è çàäà÷à
  614. ïîëó÷àåò ÂÑÅ ñîîáùåíèÿ, êîòîðûå åé áûëè ïåðåäàíû.  Ñîîáùåíèÿ «èçíóòðè»
  615. ïîñòðîåíû íà ñëóæåáíûõ ñèãíàëàõ çàäà÷è.
  616.      Äëÿ ïåðåäà÷è ñîîáùåíèÿ äîëæåí ñóùåñòâîâàòü ñâÿçíîé ïîðò (message
  617. port).  Åñëè ñèãíàë àäðåñóåòñÿ çàäà÷å, òî ñîîáùåíèå àäðåñóåòñÿ ïîðòó.
  618. Ïîðò ñîçäà¸òñÿ òîé çàäà÷åé, êîòîðàÿ ñîáèðàåòñÿ ïðèíèìàòü ñîîáùåíèÿ.
  619. Îòïðàâëÿòü ñîîáùåíèÿ ìîæåò ëþáàÿ çàäà÷à.
  620.  
  621.      Äëÿ ñîçäàíèÿ ïîðòà èñïîëüçóåòñÿ ôóíêöèÿ Exec CreateMsgPort().
  622. Ôóíêöèÿ íå èìååò àðãóìåíòîâ è âîçâðàùàåò óêàçàòåëü íà ñîçäàííûé ïîðò
  623. ëèáî íóëü ïðè îøèáêå.  Êðîìå òîãî, ýòà ôóíêöèÿ çàõâàòûâàåò ñèãíàë.
  624. Íîìåð ñèãíàëà õðàíèòñÿ â ñîçäàííîé ñòðóêòóðå è ìîæåò áûòü èñïîëüçîâàí
  625. äëÿ îæèäàíèÿ ñîîáùåíèé îò íåñêîëüêèõ ïîðòîâ îäíîâðåìåííî (îá ýòîì
  626. äàëåå).  Êîãäà íàäîáíîñòè â ñâÿçíîì ïîðòó áîëüøå íåò, ôóíêöèÿ
  627. DeleteMsgPort() (óêàçàòåëü íà ïîðò â A0) îñâîáîäèò ñèãíàë è çàíÿòóþ
  628. ñòðóêòóðîé ïàìÿòü.
  629.  
  630.      Ïîðòû ìîãóò áûòü îáùåäîñòóïíûìè (public).  Public-ïîðòû
  631. îòëè÷àþòñÿ òåì, ÷òî èìåþò ÈÌß è íàõîäÿòñÿ â ñèñòåìíîì ñïèñêå
  632. public-ïîðòîâ. Ëþáàÿ äðóãàÿ çàäà÷à â ýòîì ñëó÷àå ìîæåò íàéòè
  633. íóæíûé åé ïîðò ïî èìåíè è îòïðàâèòü ñîîáùåíèå.  Èìåííî òàêèì
  634. îáðàçîì ðàáîòàþò REXX-ïîðòû ïðîãðàìì.
  635.      Äëÿ äîáàâëåíèÿ ïîðòà â ñèñòåìíûé ñïèñîê èñïîëüçóåòñÿ ôóíêöèÿ Exec
  636. AddPort(), àðãóìåíòîì (A1) ïîëó÷àþùàÿ óêàçàòåëü íà ïîðò.  Ïåðåä
  637. äîáàâëåíèåì ïîðòà â ñïèñîê ïðèñâîéòå åìó èìÿ - ïîëîæèòå â ïîëå èìåíè
  638. ýëåìåíòà ñïèñêà óêàçàòåëü íà òåêñòîâóþ ñòðîêó.
  639.      Äëÿ óäàëåíèÿ èç ñèñòåìíîãî ñïèñêà èñïîëüçóåòñÿ RemPort().
  640.  
  641.      Ñîîáùåíèÿ ïðåäñòàâëÿþò ñîáîé ñòðóêòóðû äàííûõ ïåðåäàþùåé
  642. ïðîãðàììû.  Îíè èìåþò â íà÷àëå îáÿçàòåëüíóþ ñòðóêòóðó Message
  643. <exec/ports.#?>, çà êîòîðîé ñëåäóþò ïðîèçâîëüíûå ïîëüçîâàòåëüñêèå
  644. äàííûå.  Ðàçìåð ñîîáùåíèÿ âìåñòå ñî ñòðóêòóðîé - äî 65535 áàéò,
  645. õðàíèòñÿ ïåðåä ñàìèìè äàííûìè (ïîëå mn_Length).
  646.      Ñîîáùåíèå ïåðåäà¸òñÿ ôóíêöèåé PutMsg(), ïîëó÷àþùåé óêàçàòåëü íà
  647. ïîðò (A0) è ñîîáùåíèå (A1).  Ñîîáùåíèå ïðè ýòîì ñòàâèòñÿ â î÷åðåäü, è
  648. âûçâàâøàÿ ôóíêöèþ çàäà÷à òóò æå ïîëó÷àåò óïðàâëåíèå.  Ñîîáùåíèå íèêóäà
  649. íå êîïèðóåòñÿ, ïîýòîìó èçìåíÿòü ñîîáùåíèå íåëüçÿ äî òåõ ïîð, ïîêà
  650. àäðåñàò íå ïîëó÷èò ýòî ñîîáùåíèå è íå «ðàñïèøåòñÿ» â åãî ïîëó÷åíèè
  651. ôóíêöèåé ReplyMsg() - èíà÷å îí ïîëó÷èò åãî èçìåí¸ííûì (îá ýòîì íèæå).
  652.      Ïîëó÷àòåëü ïðèíèìàåò ñîîáùåíèÿ ïðè ïîìîùè ôóíêöèè GetMsg(),
  653. åäèíñòâåííûì àðãóìåíòîì êîòîðîé ÿâëÿåòñÿ ïîðò (A0).  Åñëè â î÷åðåäè
  654. áûëî íåñêîëüêî ñîîáùåíèé, òî êàæäûé âûçîâ GetMsg() áóäåò âûòàñêèâàòü
  655. î÷åðåäíîå.  Êîãäà ñîîáùåíèÿ êîí÷àòñÿ, GetMsg() âåðí¸ò íóëü.  Åñëè
  656. çàäà÷å íóæíî ïîäîæäàòü ïðèõîäà ñîîáùåíèÿ, òî ïðîñòåéøèé ñïîñîá ýòî
  657. ñäåëàòü - ôóíêöèÿ WaitPort(), îïÿòü æå ïîëó÷àþùàÿ óêàçàòåëü íà ïîðò
  658. (A0).  Ïîêà ñîîáùåíèé íåò, çàäà÷à ïåðåéä¸ò â ñîñòîÿíèå îæèäàíèÿ.
  659. Êîãäà ïðèøëî õîòÿ áû îäíî ñîîáùåíèå, WaitPort() âîçâðàùàåò óêàçàòåëü
  660. íà ïåðâîå ñîîáùåíèå â î÷åðåäè, ÍΠÍÅ ÂÛÍÈÌÀÅÒ ÑÎÎÁÙÅÍÈß!  Òî åñòü,
  661. ïîñëå å¸ âûçîâà ñëåäóåò âûïîëíÿòü GetMsg() äî òåõ ïîð, ïîêà ñîîáùåíèÿ
  662. íå êîí÷àòñÿ.
  663.  
  664.      Â ïðîñòåéøåì ñëó÷àå ñîîáùåíèÿ ìîãóò íå íåñòè èíôîðìàòèâíîé
  665. íàãðóçêè, ïðîñòî ñîîáùàÿ î ôàêòàõ êàêîãî-òî ñîáûòèÿ.  Îäíàêî, î÷åíü
  666. ÷àñòî òðåáóåòñÿ ïåðåäàâàòü âïîëíå êîíêðåòíóþ èíôîðìàöèþ - àðãóìåíòû,
  667. ìàññèâû...  Â ýòîì ñëó÷àå ïðîãðàììà-ïåðåäàò÷èê îáû÷íî çàõâàòûâàåò
  668. îáëàñòü ïàìÿòè ïîä ñîîáùåíèå, ñêëàäûâàåò òóäà íåîáõîäèìóþ èíôîðìàöèþ,
  669. è äîëæíà êàêèì-òî îáðàçîì âûÿñíèòü ìîìåíò, êîãäà ñîîáùåíèå áóäåò
  670. ïîëó÷åíî, ÷òîáû îñâîáîäèòü ýòó ïàìÿòü.  Äëÿ ýòîãî ñóùåñòâóåò ìåõàíèçì
  671. Reply-ïîðòîâ.
  672.      Ïðîãðàììà-ïåðåäàò÷èê â äàííîì ñëó÷àå äîëæíà ñîçäàòü ñâîé ïîðò,
  673. è çàíåñòè óêàçàòåëü íà íåãî â ïîëå mn_ReplyPort ñâîåãî ñîîáùåíèÿ.
  674. Ïðîãðàììà-ïðè¸ìíèê ïîñëå ïðè¸ìà ñîîáùåíèÿ è èñïîëüçîâàíèÿ äàííûõ èç
  675. íåãî äîëæíà âûçâàòü ôóíêöèþ ReplyMsg() ñ óêàçàòåëåì íà ñîîáùåíèå (A1).
  676. Ñ ýòîãî ìîìåíòà ïðè¸ìíèêó óæå íåëüçÿ èñïîëüçîâàòü ñîîáùåíèå.
  677. Ïåðåäàò÷èê æå ïîëó÷èò â ñâîé ReplyPort ñâñîîáùåíèå îáðàòíî -
  678. ÷òî è ÿâëÿåòñÿ òîé ñàìîé «ðàñïèñêîé î ïîëó÷åíèè».
  679.  
  680.  
  681.  15) Îæèäàíèå ñîîáùåíèé îò íåñêîëüêèõ ïîðòîâ îäíîâðåìåííî
  682.  
  683.      Êàê áûëî óïîìÿíóòî ðàíåå, ìåõàíèçì ñîîáùåíèé ïîñòðîåí íà
  684. ñèãíàëàõ.  Â ñòðóêòóðå, îïèñûâàþùåé ïîðò, åñòü ïîëå mp_SigBit,
  685. õðàíÿùåå íîìåð áèòà ñèãíàëà, êîòîðûé áóäåò ïîëó÷åí âëàäåëüöåì ïîðòà ïî
  686. ïðèõîäó ñîîáùåíèÿ - ëþáîå ñîîáùåíèå âûçûâàåò ïîñûëêó ýòîãî ñèãíàëà.
  687.  
  688.      Ïîñêîëüêó WaitPort() ïîçâîëÿåò îæèäàòü ïðèõîäà ñîîáùåíèÿ
  689. òîëüêî â îäèí ïîðò, äëÿ îæèäàíèÿ ñîîáùåíèé â íåñêîëüêèõ ïîðòàõ ðàçîì
  690. èñïîëüçóåòñÿ äðóãîé ïîäõîä.  Èç âñåõ ïîðòîâ, ñîîáùåíèÿ èç êîòîðûõ ìû
  691. æä¸ì (îæèäàþùàÿ çàäà÷à äîëæíà áûòü âëàäåëüöåì âñåõ ýòèõ ïîðòîâ - òî
  692. åñòü èìåííî îíà äîëæíà èõ ñîçäàòü!) âûáèðàåì mp_SigBit, ðàçâîðà÷èâàåì
  693. â ìàñêó ñèãíàëà è ñêëàäûâàåì âñå ñèãíàëû ëîãè÷åñêîé îïåðàöèåé ÈËÈ â
  694. îäíî 32-áèòíîå ÷èñëî.  Ýòî ÷èñëî áóäåò àðãóìåíòîì ôóíêöèè Wait().
  695.      Òåïåðü, ñòîèò ïðèéòè õîòÿ áû îäíîìó ñîîáùåíèþ, çàäà÷à ñðàçó æå
  696. âûéäåò èç ñîñòîÿíèÿ îæèäàíèÿ. Ïîñêîëüêó êàæäûé ïîðò îáû÷íî èìååò ñâîé
  697. íîìåð áèòà ñèãíàëà, ïî ðåçóëüòàòó Wait() íåòðóäíî äîãàäàòüñÿ, â êàêîé
  698. èìåííî ïîðò ïðèøëî ñîîáùåíèå.
  699.  
  700.      Ïîñêîëüêó êîëè÷åñòâî ïîëüçîâàòåëüñêèõ ñèãíàëîâ îãðàíè÷åíî, ïðè
  701. ðàáîòå ñ äîñòàòî÷íî áîëüøèì êîëè÷åñòâîì ïîðòîâ ïðèä¸òñÿ ñîçäàâàòü
  702. ïîðòû ñàìîìó, ðàñøàðèâàÿ îäèí ñèãíàë íà íåñêîëüêî ïîðòîâ ðàçîì.  Ïðè
  703. òàêîì ðàñêëàäå óæå ïðèä¸òñÿ ïîñëåäîâàòåëüíî îïðàøèâàòü ãðóïïó ïîðòîâ,
  704. ÷òîáû âûÿñíèòü, êóäà ïðèøëî ñîîáùåíèå.
  705.  
  706.      Ïîñêîëüêó âñÿ êîììóíèêàöèÿ â AmigaOS ïîñòðîåíà íà ñèãíàëàõ è
  707. ñîîáùåíèÿõ, ýòîò æå ïîäõîä ìîæíî èñïîëüçîâàòü äëÿ îæèäàíèÿ ëþáîé
  708. ãðóïïû ñîáûòèé.
  709.  
  710.  
  711.  16) Ñåìàôîðû
  712.  
  713.      Ñåìàôîðû ÿâëÿþòñÿ ñðåäñòâîì ðàçãðàíè÷åíèÿ äîñòóïà ê ðàçäåëÿåìûì
  714. ðåñóðñàì ñî ñòîðîíû íåñêîëüêèõ çàäà÷.
  715.      Ïðåäïîëîæèì, ÷òî ó íàñ åñòü íåêàÿ îáëàñòü ïàìÿòè, êóäà çàäà÷à Èêñ
  716. ñêëàäûâàåò òåêñòîâóþ ñòðîêó, à çàäà÷à Èãðåê å¸ îòòóäà ñ÷èòûâàåò.
  717. Ïîñêîëüêó Àìèãà - ìàøèíà ìíîãîçàäà÷íàÿ, âïîëíå ìîæåò ñëîæèòüñÿ òàêàÿ
  718. ñèòóàöèÿ, ÷òî ïðîãðàììà Èãðåê çàëåçëà â ñòðîêó èìåííî â òîò ñàìûé
  719. ìîìåíò, êîãäà Èêñ óñïåë âûëîæèòü òîëüêî ïîëîâèíó î÷åðåäíîé ñòðîêè.
  720. Òàêèì îáðàçîì, òî, ÷òî ñ÷èòàåò Èãðåê, áóäåò ïðåäñòàâëÿòü ñîáîé
  721. ïîëîâèíó íîâîé ñòðîêè è ïîëîâèíó ñòàðîé.
  722.  
  723.      Ôóíêöèÿ InitSemaphore(), ïîëó÷àþùàÿ óêàçàòåëü íà ñòðóêòóðó
  724. SignalSemaphore (A0), èíèöèàëèçèðóåò ñåìàôîð.  Ôóíêöèÿ íè÷åãî íå
  725. çàõâàòûâàåò, âûïîëíÿÿ òîëüêî èíèöèàëèçàöèþ.  Ñ ýòîãî ìîìåíòà ñåìàôîð
  726. ãîòîâ ê ðàáîòå.
  727.      Êîãäà çàäà÷à õî÷åò ïîëó÷èòü äîñòóï ê ðàçäåëÿåìîìó ðåñóðñó
  728. (íàïðèìåð, óïîìÿíóòîìó ó÷àñòêó ïàìÿòè), îíà äîëæíà âûçâàòü ôóíêöèþ
  729. ObtainSemaphore(), ïîëó÷àþùóþ óêàçàòåëü íà óïîìÿíóòóþ âûøå ñòðóêòóðó
  730. (A0).  Åñëè íèêòî áîëåå â äàííûé ìîìåíò íå èñïîëüçóåò ñòðóêòóðó,
  731. çàäà÷à ïðîäîëæèò âûïîëíåíèå.  Êîãäà îïåðàöèÿ ñ ðåñóðñîì çàâåðøåíà,
  732. çàäà÷à äîëæíà âûïîëíèòü ReleaseSemaphore() ñ òåì æå àðãóìåíòîì.
  733.      Åñëè â ìîìåíò ìåæäó ObtainSemaphore() è ReleaseSemaphore(),
  734. âûïîëíÿåìûìè êàêîé-ëèáî çàäà÷åé, êàêàÿ-òî åù¸ çàäà÷à âûïîëíèò òó æå
  735. ïðîöåäóðó, ïåðåäàâ óêàçàòåëü íà òîò æå ñåìàôîð - îíà áóäåò ïåðåâåäåíà
  736. â ñîñòîÿíèå îæèäàíèÿ äî òåõ ïîð, ïîêà «âëàäåëåö» ñåìàôîðà íå âûïîëíèò
  737. ReleaseSemaphore().  Ñ ýòîãî ìîìåíòà çàäà÷à ïîëó÷èò óïðàâëåíèå.  Åñëè
  738. â òàêóþ ñèòóàöèþ ïîïàä¸ò íåñêîëüêî çàäà÷, îíè áóäóò ïîñòàâëåíû â
  739. î÷åðåäü è áóäóò ïîëó÷àòü óïðàâëåíèå ïîî÷åð¸äíî.
  740.  
  741.      Åñëè çàäà÷à õî÷åò âñåãî ëèøü óçíàòü, ñâîáîäåí ëè ðåñóðñ â äàííûé
  742. ìîìåíò, íå ïåðåõîäÿ â ñîñòîÿíèå îæèäàíèÿ - äëÿ ýòîãî ñóùåñòâóåò
  743. ôóíêöèÿ AttemptSemaphore().  Ðåçóëüòàò å¸ - TRUE (íå íóëü), åñëè
  744. ðåñóðñ ñâîáîäåí.  Â ýòîì ñëó÷àå âûçîâ AttemptSemaphore() èäåíòè÷åí
  745. âûçîâó ObtainSemaphore() - òî åñòü, çàäà÷à ñòàíîâèòñÿ âëàäåëüöåì
  746. ðåñóðñà, è äîëæíà âûïîëíèòü ReleaseSemaphore() ïî çàâåðøåíèè ðàáîòû ñ
  747. íèì.  Åñëè ðåçóëüòàò áûë FALSE (0) - çíà÷èò, ðåñóðñ óæå êåì-òî çàíÿò.
  748.  
  749.      Ñóùåñòâóþò áîëåå ñëîæíûå ñëó÷àè, íå âïèñûâàþùèåñÿ â ýòîò
  750. ìåõàíèçì.  Íàïðèìåð, ìîæåò áûòü ñïèñîê, ó êîòîðîãî åñòü îäèí
  751. «ïèñàòåëü» è ìíîæåñòâî «÷èòàòåëåé».  Î÷åâèäíî, ÷òî «÷èòàòåëè» äðóã
  752. äðóãó íå ìåøàþò íèêîèì îáðàçîì, è ïîýòîìó íåò ñìûñëà ðàçãðàíè÷èâàòü
  753. äîñòóï ìåæäó íèìè.  À ñ äðóãîé ñòîðîíû, äîëæíà áûòü âîçìîæíîñòü ðàçîì
  754. îòñå÷ü âñåõ «÷èòàòåëåé», êîãäà àêòèâèçèðóåòñÿ «ïèñàòåëü».  Óïîìÿíóòûé
  755. ðàíåå ìåõàíèçì ïðåäíàçíà÷åí äëÿ «ïèñàòåëåé», êîòîðûå äîëæíû îáëàäàòü
  756. èñêëþ÷èòåëüíûì äîñòóïîì ê ðåñóðñó, çàùèùàåìîìó ñåìàôîðîì.  Äëÿ
  757. «÷èòàòåëåé» æå åñòü åù¸ äâå ôóíêöèè - ObtainSemaphoreShared() è
  758. AttemptSemaphoreShared(), êîòîðûå ïîçâîëÿþò ïðèìåíÿþùèì èõ «óæèâàòüñÿ»
  759. íà ðåñóðñå îäíîâðåìåííî.  Ýòè ôóíêöèè, êðîìå òîãî, äîïóñêàþò ïàðû
  760. âëîæåííûõ âûçîâîâ.  Äëÿ îñâîáîæäåíèÿ ðåñóðñà ïðèìåíÿåòñÿ âñ¸ òîò æå
  761. ReleaseSemaphore().
  762.  
  763.      Åñëè çàäà÷à õî÷åò ïîëó÷èòü äîñòóï ê ãðóïïå ðåñóðñîâ ðàçîì, ìîæåò
  764. áûòü ïîëåçíî îáúåäèíåíèå ñåìàôîðîâ â ñïèñîê.  ObtainSemaphoreList(),
  765. ïîëó÷àþùàÿ â êà÷åñòâå àðãóìåíòà ñïèñîê ñåìàôîðîâ (A0), âûïîëíÿåò
  766. Obtain äëÿ íèõ âñåõ îäíîâðåìåííî.  Ýòîò âàðèàíò ïðåäïî÷èòåëüíåå
  767. ïîñëåäîâàòåëüíîãî âûïîëíåíèÿ Obtain, ïîñêîëüêó íå ìîæåò ïðèâåñòè ê
  768. âçàèìíîé áëîêèðîâêå çàäà÷ (deadlock), åñëè äðóãàÿ çàäà÷à çàõî÷åò
  769. ïðîâåñòè òî æå ñàìîå â äðóãîì ïîðÿäêå.
  770.  
  771.      Òàê æå, êàê è ïîðòû, ñåìàôîðû ìîãóò áûòü îáùåñèñòåìíî äîñòóïíû.
  772. Äëÿ ýòîãî âìåñòî InitSemaphore() âûïîëíÿåòñÿ AddSemaphore().  Ïåðåä
  773. ýòèì íåîáõîäèìî èíèöèàëèçèðîâàòü ïîëå èìåíè (ss_Link.ln_Name).
  774. Îáðàòíàÿ îïåðàöèÿ - RemSemaphore().
  775.  
  776.      Ïàðàëëåëüíî ñ îïèñàííûì ñèíõðîííûì ìåõàíèçìîì ñåìàôîðîâ, â
  777. AmigaOS ðåàëèçîâàí òàêæå è àñèíõðîííûé ìåõàíèçì, ïîñòðîåííûé íà
  778. ñîîáùåíèÿõ.  Äëÿ ýòîãî ïðèìåíÿåòñÿ ïàðà ôóíêöèé Procure()/Vacate().
  779.      Çàäà÷à, êîòîðîé òðåáóåòñÿ ðàáîòà ñ ðåñóðñîì, äîëæíà èìåòü ãîòîâûé
  780. ReplyPort è ñîîáùåíèå (ñòðóêòóðà SemaphoreMessage, îïèñàíèå ñìîòðèòå â
  781. <exec/semaphores.#?>, êîòîðîå ïåðåäà¸òñÿ âòîðûì àðãóìåíòîì (A1)
  782. ôóíêöèè Procure().  Ïîëå ssm_Message.ln_Name äîëæíà ñîäåðæàòü 1 äëÿ
  783. îáû÷íîãî (exclusive) äîñòóïà è 0 äëÿ ðàçäåëÿåìîãî (shared).  Îñòàëüíûå
  784. çíà÷åíèÿ íåäîïóñòèìû.  Êîãäà ðåñóðñ ñòàíåò ñâîáîäåí, îí ñðàçó ñòàíåò
  785. àâòîìàòè÷åñêè çàõâà÷åí, è çàäà÷à ïîëó÷èò ñîîáùåíèå íà ñâîé ReplyPort.
  786. Ýòîò ìåõàíèçì ïîçâîëÿåò, â ÷àñòíîñòè, îæèäàòü îñâîáîæäåíèÿ äàæå
  787. íåñêîëüêèõ ñåìàôîðîâ ðàçîì.
  788.      Ôóíêöèÿ Vacate() èñïîëüçóåòñÿ êàê ïàðà ê Procure() äëÿ
  789. îñâîáîæäåíèÿ çàíÿòîãî ðåñóðñà.  Àðãóìåíòû ó í帠òå æå.  Ôóíêöèÿ ìîæåò
  790. áûòü âûïîëíåíà â ëþáîé ìîìåíò, â òîì ÷èñëå è ðàíüøå, ÷åì ïðèä¸ò
  791. ñîîáùåíèå îá îñâîáîæäåíèè - òåì ñàìûì ïðåðûâàÿ âûïîëíåíèå Procure().
  792. Ïîëå ssm_Semaphore áóäåò î÷èùåíî, ïðèä¸ò îòâåò, åñëè îí åù¸ íå áûë
  793. ïîëó÷åí.
  794.  
  795.  
  796.  17) Ðåñóðñû
  797.  
  798.      Ðåñóðñû (resources) ïðåäñòàâëÿþò ñîáîé åù¸ îäèí «êèðïè÷èê»
  799. AmigaOS.  Îíè âûïîëíÿþò ôóíêöèþ, ïîõîæóþ íà ôóíêöèþ ñåìàôîðîâ.
  800. Ðåñóðñû ïðåäíàçíà÷åíû äëÿ ðàçãðàíè÷åíèÿ äîñòóïà ê ðàçëè÷íûì àïïàðàòíûì
  801. êîìïîíåíòàì Àìèãè.  Ïðèâåä¸ì ñïèñîê èìåþùèõñÿ ðåñóðñîâ:
  802.  
  803.      potgo.resource     - ïîðò àíàëîãîâîãî äæîéñòèêà
  804.      ciaa.resource      - 8520-a
  805.      ciab.resource      - 8520-b
  806.      battclock.resource - ýíåðãîíåçàâèñèìûå ÷àñû/êàëåíäàðü
  807.      misc.resource      - ïàðàëëåëüíûé è ïîñëåäîâàòåëüíûé ïîðòû
  808.      disk.resource      - äèñêîâîä
  809.      battmem.resource   - ýíåðãîíåçàâèñèìàÿ ïàìÿòü
  810.      card.resource      - PCMCIA-ïîðò
  811.  
  812.      Ðàáîòà ñ ðåñóðñàìè ïî ñóòè ïîõîæà íà ðàáîòó ñ áèáëèîòåêàìè:
  813. êàæäûé ðåñóðñ ïðåäîñòàâëÿåò íåêîòîðûé íàáîð ôóíêöèé, ðàçãðàíè÷èâàþùèõ
  814. äîñòóï ê «æåëåçó» ñî ñòîðîíû íåñêîëüêèõ çàäà÷, à òàêæå ïðåäîñòàâëÿþùèõ
  815. èíòåðôåéñ ê ýòîìó «æåëåçó» (íàèáîëåå «íàâîðî÷åí» â ýòîì ïëàíå PCMCIA).
  816. Îòëè÷èå îò áèáëèîòåê çàêëþ÷àåòñÿ â òîì, ÷òî ðåñóðñ íå òðåáóåò çàêðûòèÿ
  817. è íå èìååò ñ÷¸ò÷èêà ïîëüçîâàòåëåé. Ïîëüçîâàòåëü ðåñóðñà ìîæåò áûòü
  818. òîëüêî îäèí. Ðåñóðñ âñåãäà ïðèñóòñòâóåò â ïàìÿòè. Âûçîâ OpenResource()
  819. ñ èìåíåì ðåñóðñà (A1) âîçâðàùàåò óêàçàòåëü íà ðåñóðñ, åñëè îí íàéäåí.
  820. Âïîñëåäñòâèè ýòîò óêàçàòåëü èñïîëüçóåòñÿ êàê áàçà áèáëèîòåêè.
  821.      Ïîñëå îòêðûòèÿ ìîæíî âûçûâàòü ôóíêöèè ðåñóðñà.  Òàê, äëÿ äîñòóïà
  822. ê «æåëåçó» äèñêîâîäà (íàïðèìåð, äëÿ íàïèñàíèÿ çàìåíû èìåþùåãîñÿ
  823. trackdisk.device) íóæíî âûïîëíèòü AllocUnit(), ïåðåäàâ åìó íîìåð
  824. íóæíîãî äèñêîâîäà îò 0 äî 3 (D0), â ðåçóëüòàòå çàõâàòèâ îäèí èç
  825. äîñòóïíûõ ÷åòûð¸õ äèñêîâîäîâ (âåðíóëñÿ íå íóëü) èëè óáåäèòüñÿ, ÷òî
  826. ýòîò äèñêîâîä óæå êåì-òî çàíÿò (âåðíóëñÿ íóëü).  Åñëè äèñêîâîä áûë
  827. óñïåøíî çàõâà÷åí, ïî çàâåðøåíèè ðàáîòû ñ íèì íóæíî âûïîëíèòü
  828. FreeUnit() c òåì æå àðãóìåíòîì.
  829.      Ðàáîòà ñ îñòàëüíûìè ðåñóðñàìè ïî ñóòè àíàëîãè÷íà.
  830.  
  831.      Ðåñóðñû íå îáÿçàòåëüíî îïåðèðóþò «æåëåçîì».  Òàê, patchcontrol
  832. â ñîñòàâå ïàêåòà MCP äîáàâëÿåò â ñèñòåìó ðåñóðñ patch.resource,
  833. ïîçâîëÿþùèé ðàçíîãî ðîäà ïàò÷àì, ïîääåðæèâàþùèì ýòîò èíòåðôåéñ,
  834. óæèâàòüñÿ âìåñòå áåç êîíôëèêòîâ è ïîçâîëÿòü óáèðàòü ïàò÷è, êîòîðûå
  835. áûëè íå ïîñëåäíèìè.
  836.      Ëþáàÿ çàäà÷à ìîæåò äîáàâèòü ñâîé ðåñóðñ ê ñïèñêó ñèñòåìíûõ
  837. ðåñóðñîâ ôóíêöèåé Exec AddResource().  Îáðàòíàÿ îïåðàöèÿ âûïîëíÿåòñÿ
  838. ñîîòâåòñòâåííî ôóíêöèåé RemResource().
  839.  
  840.  
  841.  18) Äåâàéñû
  842.  
  843.      Äåâàéñ (device) - åù¸ îäèí «êèðïè÷èê».  Äåâàéñû îáû÷íî âûïîëíÿþò
  844. ôóíêöèþ äðàéâåðîâ ðàçëè÷íûõ óñòðîéñòâ, à òàêæå ïîääåðæêè ââîäà-âûâîäà
  845. â ëþáîì âèäå.  Â îòëè÷èå îò áèáëèîòåê, èíòåðôåéñ äåâàéñîâ, âûïîëíÿþùèõ
  846. ñõîäíóþ çàäà÷ó, ñòàíäàðòèçîâàí, è â ðåçóëüòàòå â ïðîãðàììå ìîæíî
  847. ñäåëàòü âûáîð, êàêîé èç äåâàéñîâ îòêðûâàòü - à íàáîð îïåðàöèé â êàæäîì
  848. èç íèõ èäåíòè÷åí.
  849.      Òàêèì îáðàçîì, â òåðìèíàëüíîé ïðîãðàììå ìîæíî âûáèðàòü íå òîëüêî
  850. serial.device, íî è ëþáîé äðóãîé äåâàéñ îáñëóæèâàíèÿ ëþáîãî
  851. ïîñëåäîâàòåëüíîãî ïîðòà (è äàæå íåîáÿçàòåëüíî ïîñëåäîâàòåëüíîãî - åñòü
  852. äåâàéñ äëÿ îáñëóæèâàíèÿ ìîäåìà, âîòêíóòîãî â PCMCIA ïîðò).  Äëÿ
  853. äîñòóïà ê äèñêó ìîæíî âûáðàòü êàê scsi.device, òàê è trackdisk.device,
  854. atapi.device...
  855.  
  856.      Âûçîâ äåâàéñîâ âûïîëíÿåòñÿ ñîâåðøåííî èíûì îáðàçîì, íåæåëè
  857. áèáëèîòåê (ïðàâäà, èç ýòîãî ïðàâèëà åñòü è èñêëþ÷åíèÿ).  Âûçîâ äåâàéñà
  858. íà íèçêîì óðîâíå ïðåäñòàâëÿåò ñîáîé îáìåí ñîîáùåíèÿìè.  Íà áîëåå
  859. âûñîêîì óðîâíå - ýòî âûïîëíåíèå ôóíêöèé Exec SendIO(), WaitIO(),
  860. DoIO(), AbortIO(), CheckIO().
  861.      Òàê æå, êàê è áèáëèîòåêó, äåâàéñ ïåðåä ðàáîòîé ñ íèì íåîáõîäèìî
  862. îòêðûòü, à ïî çàâåðøåíèè ðàáîòû - çàêðûòü.  Â îòëè÷èå îò áèáëèîòåêè,
  863. äåâàéñó òðåáóåòñÿ ïåðåäà÷à íîìåðà óñòðîéñòâà - UNIT.  Ýòî ïîçâîëÿåò
  864. ðàáîòàòü ñ ëþáûì èç óñòðîéñòâ, ïîäêëþ÷åííûõ íà îäèí è òîò æå ïîðò.
  865. Íîìåð âåðñèè äåâàéñó íå òðåáóåòñÿ.
  866.      Ïîñêîëüêó ðàáîòà ñ äåâàéñîì îñíîâàíà íà ñîîáùåíèÿõ, äëÿ í帠íóæåí
  867. ReplyPort.  Îí äîëæåí áûòü ñîçäàí çàðàíåå (ReplyPort()).  Êðîìå òîãî,
  868. íóæíà ñòðóêòóðà IORequest, êîòîðàÿ áóäåò äàëåå ïåðåäàâàòüñÿ âñÿêèé ðàç
  869. ëþáîé îïåðàöèè ñ äåâàéñîì - ýòà ñòðóêòóðà ïðåäñòàâëÿåò ñîáîé ñîîáùåíèå
  870. ñ ïîëüçîâàòåëüñêèìè äàííûìè.  Ðàçìåð ñîîáùåíèÿ, ïåðåäàâàåìîãî äåâàéñó,
  871. íå îãðàíè÷èâàåòñÿ ðàçìåðîì ýòîé ñòðóêòóðû.  Â çàâèñèìîñòè îò çàäà÷è
  872. ïîñëå í帠óêàçûâàþòñÿ ïîëüçîâàòåëüñêèå äàííûå ðàçëè÷íîãî ðàçìåðà.
  873.  
  874.      Ïåðåä îòêðûòèåì äåâàéñà IORequest óæå äîëæåí ñóùåñòâîâàòü.
  875. Ñîçäà¸ò å¸ ôóíêöèÿ Exec CreateIORequest(), ïîëó÷àþùàÿ óêàçàòåëü íà
  876. ReplyPort (A0) è ðàçìåð IORequest äëÿ äàííîãî ñëó÷àÿ (D0). Êîãäà
  877. IORequest óæå ñîçäàí, ìîæíî îòêðûâàòü äåâàéñ - ýòî äåëàåòñÿ ôóíêöèåé
  878. OpenDevice(), ïîëó÷àþùåé óêàçàòåëü íà IORequest.  Àðãóìåíòàìè ñëóæàò
  879. èìÿ äåâàéñà (A0), íîìåð óñòðîéñòâà (D0), IORequest (A1) è ôëàãè (D1).
  880. Ôëàãè çàäàþò ðàçëè÷íûå ðåæèìû ðàáîòû äåâàéñà è çàâèñÿò îò êîíêðåòíîãî
  881. äåâàéñà, ïî óìîë÷àíèþ - íóëü.
  882.      Â îòëè÷èå îò áèáëèîòåêè, íóëü â ðåçóëüòàòå OpenDevice() îçíà÷àåò
  883. óñïåøíîå îòêðûòèå äåâàéñà, à íåíóëåâîå çíà÷åíèå - îøèáêó.
  884.  
  885.      Ðàçëè÷íûå îïåðàöèè ñ äåâàéñàìè âûïîëíÿþòñÿ ôóíêöèÿìè Exec.  Ïåðåä
  886. òåì, êàê âûïîëíèòü î÷åðåäíóþ îïåðàöèþ, íóæíî çàïîëíèòü ñîîòâåòñòâóþùèå
  887. ïîëÿ ñòðóêòóðû IORequest.  Ïîëå io_Command ñîäåðæèò êîä îïåðàöèè (îá
  888. ýòîì íèæå), à io_Error áóäåò ñîäåðæàòü êîä îøèáêè ïî çàâåðøåíèè.
  889.  
  890.      SendIO() çàïóñêàåò îïåðàöèþ, ïîëó÷àÿ óêàçàòåëü íà IORequest (A1).
  891. Óïðàâëåíèå âûçâàâøåé ôóíêöèþ çàäà÷å áóäåò âîçâðàùåíî íåìåäëåííî, à
  892. îïåðàöèÿ áóäåò âûïîëíÿòüñÿ àñèíõðîííî.
  893.      WaitIO() ïîçâîëÿåò ïîäîæäàòü äî çàâåðøåíèÿ îïåðàöèè, ïåðåâîäÿ
  894. çàäà÷ó â ðåæèì îæèäàíèÿ, åñëè îïåðàöèÿ åù¸ íå çàâåðøåíà.
  895.      DoIO() ïðåäñòàâëÿåò ñîáîé SendIO() è WaitIO() «â îäíîì ôëàêîíå»,
  896. âûïîëíÿÿ îïåðàöèþ è îòäàâàÿ óïðàâëåíèå òîëüêî ïî å¸ çàâåðøåíèè.
  897.      CheckIO() ïîçâîëÿåò ïðîâåðèòü, çàâåðøèëîñü ëè âûïîëíåíèå
  898. îïåðàöèè, âîçâðàùàÿ FALSE, åñëè îïåðàöèÿ ïîêà ïðîäîëæàåòñÿ.
  899.      AbortIO() ïðåäíàçíà÷åíà äëÿ ïðåðûâàíèÿ âûïîëíÿþùåéñÿ îïåðàöèè.
  900. AbortIO() íå óáèðàåò ñîîáùåíèå èç î÷åðåäè, Âû ïî-ïðåæíåìó äîëæíû
  901. âûïîëíèòü WaitIO(). Íàçíà÷åíèå ýòîé ôóíêöèè - àâàðèéíîå çàâåðøåíèå
  902. îïåðàöèè. Îíà ìîæåò âûïîëíèòüñÿ íåìåäëåííî, à ìîæåò íå âûïîëíèòüñÿ
  903. âîîáùå - ýòî çàâèñèò îò äåâàéñà è òèïà îáñëóæèâàåìîãî óñòðîéñòâà.
  904. Åñëè îïåðàöèÿ óæå çàâåðøåíà, AbortIO() íå äåëàåò íè÷åãî.
  905.  
  906.      Ïî çàâåðøåíèè ðàáîòû ñ äåâàéñîì åãî íåîáõîäèìî çàêðûòü, âûïîëíèâ
  907. CloseDevice() ñ åäèíñòâåííûì àðãóìåíòîì - IORequest (A1).  Çàòåì
  908. íåîáõîäèìî âûïîëíèòü DeleteIORequest() (A0) è DeleteMsgPort().
  909. Ê ìîìåíòó çàêðûòèÿ äåâàéñà âñå îïåðàöèè ñ íèì äîëæíû áûòü çàâåðøåíû!
  910.  
  911.  
  912.  19) Îñíîâíûå îïåðàöèè ïî ðàáîòå ñ äåâàéñàìè
  913.  
  914.      Äëÿ ëþáûõ ñóùåñòâóþùèõ äåâàéñîâ ñòàíäàðòèçèðîâàí îáùèé íàáîð
  915. âûïîëíÿåìûõ èìè îïåðàöèé.  Êàæäàÿ îïåðàöèÿ èìååò êîä, ïðåäñòàâëÿþùèé
  916. ñîáîé êîíñòàíòó.  Êîíêðåòíûé äåâàéñ ìîæåò êàê ðåàëèçîâàòü âåñü ýòîò
  917. íàáîð, òàê è ÷àñòü íàáîðà.  Ýòèìè îáùèìè äëÿ âñåõ äåâàéñîâ îïåðàöèÿìè
  918. ÿâëÿþòñÿ:
  919.  
  920.      CMD_INVALID
  921.      CMD_RESET
  922.      CMD_READ
  923.      CMD_WRITE
  924.      CMD_UPDATE
  925.      CMD_CLEAR
  926.      CMD_STOP
  927.      CMD_START
  928.      CMD_FLUSH
  929.  
  930.      Êðîìå òîãî, îáùåé äëÿ âñåõ äåâàéñîâ ÿâëÿåòñÿ ñòðóêòóðà IORequest,
  931. â ïîëå io_Command êîòîðîé êëàä¸òñÿ êîä îïåðàöèè.
  932.      Äåéñòâèå êàæäîé èç ýòèõ îïåðàöèé çàâèñèò îò êîíêðåòíîãî äåâàéñà.
  933. CMD_WRITE äëÿ scsi.device âûïîëíÿåò çàïèñü íà äèñê, äëÿ serial.device
  934. îòïðàâëÿåò äàííûå â ïîðò, à äëÿ cd.device íåäåéñòâèòåëüíà âîîáùå.
  935.      Ó êàæäîãî äåâàéñà, êðîìå ïåðå÷èñëåííûõ îïåðàöèé, ìîãóò áûòü åù¸ è
  936. ñïåöèôè÷íûå äëÿ ýòîãî äåâàéñà îïåðàöèè. Îíè òîæå ÿâëÿþòñÿ êîíñòàíòàìè.
  937. Êàæäûé äåâàéñ òàêæå ìîæåò èìåòü ðàñøèðåíèå ñòðóêòóðû IORequest -
  938. èìåííî äëÿ ýòîãî ôóíöèè CreateIORequest() ïåðåäà¸òñÿ ðàçìåð ñòðóêòóðû.
  939.  ÷àñòíîñòè, timer.device èñïîëüçóåò ñòðóêòóðó timerequest, ñîäåðæàùóþ
  940. ïîìèìî IORequest ñïåöèôè÷íóþ äëÿ ðàáîòû ñî âðåìåíåì èíôîðìàöèþ.
  941.      Âûçîâ íå ñóùåñòâóþùåé ó äåâàéñà îïåðàöèè íå ôàòàëåí è ïðèâîäèò ê
  942. âîçâðàòó äåâàéñîì îøèáêè IOERR_NOCMD.
  943.  
  944.      Äëÿ äåâàéñîâ, îñóùåñòâëÿþùèõ ââîä-âûâîä, îáû÷íî èñïîëüçóåòñÿ
  945. ñòðóêòóðà IOStdReq, ñîäåðæàùàÿ (êðîìå ïîëåé, èìåþùèõñÿ â IORequest)
  946. óêàçàòåëü íà èíôîðìàöèîííûé ìàññèâ (io_Data), îáú¸ì ïåðåäàâàåìîé
  947. èíôîðìàöèè â áàéòàõ (io_Length), ñìåùåíèå îò íà÷àëà áëî÷íîãî
  948. óñòðîéñòâà â áàéòàõ (io_Offset) è ðåàëüíî ïåðåäàííûé îáú¸ì ïî
  949. çàâåðøåíèè îïåðàöèè (io_Actual) - ñìîòðèòå exec/io.#?.
  950.  
  951.  
  952.  20) Ðàáîòà ñ áëî÷íûìè óñòðîéñòâàìè
  953.  
  954.      Óñòðîéñòâà áëî÷íîãî äîñòóïà (block-oriented) - âèí÷åñòåðû,
  955. äèñêîâîäû, CD-ROM, ìàãíèòîîïòèêà, ôëýø-êàðòû - îòëè÷àþòñÿ îò ïîòîêîâûõ
  956. (stream) óñòðîéñòâ òåì, ÷òî ïðè ðàáîòå ñ íèìè àäðåñóåòñÿ òðåáóåìûé
  957. âûïîëíÿåìîé îïåðàöèè ó÷àñòîê íîñèòåëÿ.
  958.  
  959.      Óñòðîéñòâà áëî÷íîãî äîñòóïà ìîãóò èìåòü îáû÷íóþ äëÿ äèñêîâ
  960. îðãàíèçàöèþ - äåëåíèå íà ñåêòîðà, ïîâåðõíîñòè è öèëèíäðû.  Ìîãóò èìåòü
  961. ðàçíûé ðàçìåð ñåêòîðà (ê ïðèìåðó, äëÿ âèí÷åñòåðà îáû÷íûé ðàçìåð
  962. ñåêòîðà - 512 áàéò, à äëÿ CD-ROM - 2048 áàéò).  Ìîãóò èìåòü ðàçíóþ
  963. ãåîìåòðèþ - íàïðèìåð, ó âèí÷åñòåðîâ îáû÷íî òûñÿ÷è öèëèíäðîâ, à CD-ROM
  964. ïðåäñòàâëÿåòñÿ îäíèì-åäèíñòâåííûì òðåêîì, ðàçáèòûì íà ñåêòîðà.
  965. Ôëýø-êàðòû ìîãóò âîîáùå íå èìåòü áëî÷íîé ñòðóêòóðû.  Äëÿ óíèôèêàöèè
  966. äîñòóïà ê ëþáîìó áëî÷íîìó óñòðîéñòâó îíî àäðåñóåòñÿ ëèíåéíûì ñìåùåíèåì
  967. â áàéòàõ (ïîëå io_Offset). Ñìåùåíèå äîëæíî áûòü êðàòíûì ðàçìåðó áëîêà!
  968.      Êëàññè÷åñêèì áëî÷íûì óñòðîéñòâîì ÿâëÿåòñÿ äèñêîâîä, îáñëóæèâàåìûé
  969. trackdisk.device.  Ýòîò äåâàéñ è ïîäîáíûå åìó äåâàéñû îáñëóæèâàþò
  970. ñëåäóþùèé íàáîð êîìàíä:
  971.  
  972.      CMD_CLEAR       - ñáðîñ êýøà ïî ÷òåíèþ
  973.                        Â ñëó÷àå äèñêîâîäà ïðè ëþáîì îáðàùåíèè ê
  974.                        äèñêåòå òðåê ñ÷èòûâàåòñÿ öåëèêîì, è ïîâòîðíîå
  975.                        îáðàùåíèå ê òðåêó âûäà¸ò èìåþùèåñÿ â ïàìÿòè
  976.                        äàííûå.  Ýòà êîìàíäà äåëàåò èõ
  977.                        íåäåéñòâèòåëüíûìè, è ïîâòîðíîå îáðàùåíèå ïî
  978.                        ÷òåíèþ âûçîâåò ïåðå÷èòûâàíèå òðåêà.
  979.      CMD_READ        - ÷òåíèå
  980.      CMD_UPDATE      - ñáðîñ êýøà ïî çàïèñè
  981.                        Çàïèñü äàííûõ íà òðåê íå âûçûâàåò íåìåäëåííîãî
  982.                        ñáðîñà íà äèñê.  Òðåê çàïèñûâàåòñÿ öåëèêîì
  983.                        òîëüêî ïðè íåîáõîäèìîñòè ïåðåõîäà íà äðóãîé
  984.                        òðåê.  Ýòà êîìàíäà âûçûâàåò çàïèñü «íàñèëüíî».
  985.      CMD_WRITE       - çàïèñü
  986.      TD_ADDCHANGEINT - ðåãèñòðàöèÿ îáðàáîò÷èêà ñìåíû äèñêà
  987.                        Ïîçâîëÿåò îïðåäåëèòü êîä, êîòîðûé áóäåò
  988.                        âûïîëíÿòüñÿ â ñëó÷àå ñìåíû äèñêà.
  989.      TD_CHANGENUM    - ñ÷èòûâàíèå ñ÷¸ò÷èêà ñìåí äèñêà
  990.      TD_CHANGESTATE  - ïðîâåðêà íàëè÷èÿ äèñêà â ïðèâîäå
  991.      TD_EJECT        - âûáðîñ äèñêà. Íà âñòðîåííîì äèñêîâîäå íå
  992.                        ïîääåðæèâàåòñÿ.  Ïðåäíàçíà÷åíà äëÿ CD-ROM etc.
  993.      TD_FORMAT       - ôîðìàòèðîâàíèå òðåêà
  994.      TD_GETDRIVETYPE - îïðåäåëåíèå òèïà ïðèâîäà
  995.                        Òèïû îïèñàíû â <devices/trackdisk.#?>
  996.      TD_GETGEOMETRY  - ñ÷èòûâàíèå ãåîìåòðèè äèñêà
  997.                        Ôîðìàò îïèñàí â <devices/trackdisk.#?>
  998.      TD_GETNUMTRACKS - ñ÷èòûâàíèå êîëè÷åñòâà öèëèíäðîâ
  999.      TD_MOTOR        - óïðàâëåíèå ìîòîðîì
  1000.      TD_PROTSTATUS   - ïðîâåðêà íàëè÷èÿ çàùèòû çàïèñè
  1001.      TD_RAWREAD      - íèçêîóðîâíåâîå ÷òåíèå
  1002.      TD_RAWWRITE     - íèçêîóðîâíåâàÿ çàïèñü
  1003.                        Ïîñëåäíèå äâå êîìàíäû ïîçâîëÿþò ðàáîòàòü ñ
  1004.                        «÷óæèìè» ôîðìàòàìè - íàïðèìåð, ñ äèñêåòàìè IBM
  1005.                        PC.  Â ýòîì ñëó÷àå trackdisk.device âîçâðàùàåò
  1006.                        äîðîæêó âìåñòå ñî âñåìè ìàðêåðàìè, ñèíõðîáèòàìè
  1007.                        è ò.ï. â «ñûðîì» MFM-ôîðìàòå.
  1008.      TD_REMCHANGEINT - îòìåíà ðåãèñòðàöèè TD_ADDCHANGEINT
  1009.      TD_SEEK         - ïîçèöèîíèðîâàíèå.  Èñïîëüçóåòñÿ äëÿ ñëóæåáíûõ
  1010.                        öåëåé (÷èñòÿùèå äèñêè, äèàãíîñòèêà è ò.ä.)
  1011.  
  1012.      Êàê óïîìèíàëîñü âûøå, êîíêðåòíûé äåâàéñ íå îáÿçàí îáñëóæèâàòü
  1013. âñå ïåðå÷èñëåííûå êîìàíäû.  Åñëè êàêàÿ-òî êîìàíäà íå îáñëóæèâàåòñÿ,
  1014. âîçâðàùàåòñÿ îøèáêà.  Áîëåå ïîäðîáíî ñìîòðèòå trackdisk.doc.
  1015.      Ïîñêîëüêó ñìåùåíèå çàäà¸òñÿ 32-áèòíûì ÷èñëîì, âïîëíå î÷åâèäíûì
  1016. ñòàíîâèòñÿ îãðàíè÷åíèå íà îáú¸ì óñòðîéñòâà â ÷åòûðå ãèãàáàéòà.  Äëÿ
  1017. ïðåîäîëåíèÿ ýòîãî îãðàíè÷åíèÿ âìåñòî ñòàíäàðòíûõ êîìàíä èñïîëüçóþòñÿ
  1018. èõ 64-áèòíûå ýêâèâàëåíòû:
  1019.  
  1020.      NSCMD_TD_READ64
  1021.      NSCMD_TD_WRITE64
  1022.      NSCMD_TD_SEEK64
  1023.      NSCMD_TD_FORMAT64
  1024.  
  1025.      Ïðè ýòîì ñòàðøàÿ ïîëîâèíêà 64-áèòíîãî ñëîâà ïåðåä îïåðàöèåé
  1026. êëàä¸òñÿ â ïîëå io_Actual.  Ýòè êîìàíäû ïîääåðæèâàþòñÿ òîëüêî íîâûìè
  1027. âåðñèÿìè äåâàéñîâ (ê ïðèìåðó, scsi.device v43 è ñòàðøå).  Ïðîâåðÿéòå
  1028. ðåçóëüòàò èõ èñïîëüçîâàíèÿ - åñëè äåâàéñ âîçâðàòèë îøèáêó, çíà÷èò
  1029. ñëåäóåò èñïîëüçîâàòü 32-áèòíûå êîìàíäû, è îáú¸ì íîñèòåëÿ çàâåäîìî
  1030. ìåíüøå 4 ãèãàáàéò.
  1031.  
  1032.  
  1033.  21) Ðàáîòà ñ ïîòîêîâûìè óñòðîéñòâàìè
  1034.  
  1035.      Ïîòîêîâûå óñòðîéñòâà - íàïðèìåð, ïîñëåäîâàòåëüíûé ïîðò, â
  1036. îñíîâíîì óïðàâëÿþòñÿ ñòàíäàðòíûì íàáîðîì CMD-êîìàíä.  Ê íèì
  1037. äîáàâëÿþòñÿ íåñêîëüêî êîìàíä è ïîëåé óïðàâëÿþùåé ñòðóêòóðû,
  1038. ñïåöèôè÷íûõ äëÿ óñòðîéñòâà.  Òàê, äëÿ serial.device èñïîëüçóåòñÿ
  1039. ðàñøèðåííàÿ ñòðóêòóðà IOExtSer è äîñòóïíû êîìàíäû:
  1040.  
  1041.      SDCMD_BREAK     - ïîñûëêà ñèãíàëà BREAK
  1042.      SDCMD_QUERY     - ñ÷èòûâàíèå ñîñòîÿíèÿ ïîðòà
  1043.                        Ïîçâîëÿåò îïðåäåëèòü ñîñòîÿíèå ñèãíàëîâ
  1044.                        RTS/CTS, DTR/DSR, CD, RI, ñèãíàë BREAK,
  1045.                        ïåðåïîëíåíèå áóôåðà.
  1046.      SDCMD_SETPARAMS - óñòàíîâêà ñîñòîÿíèÿ ïîðòà
  1047.                        Óñòàíàâëèâàåòñÿ ðàçìåð áóôåðà, ñêîðîñòü ïîðòà,
  1048.                        äëèòåëüíîñòü ñèãíàëà BREAK, ôîðìàò ïîñûëêè,
  1049.                        xON/xOFF ðåæèì è ïðî÷åå.
  1050.  
  1051.      Ïðî÷èå äåâàéñû, ðàáîòàþùèå ñ ïîñëåäîâàòåëüíûìè ïîðòàìè, ìîãóò êàê
  1052. ïîääåðæèâàòü, òàê è íå ïîääåðæèâàòü ýòè êîìàíäû è ðåæèìû.  Òàê,
  1053. íàïðèìåð, 8n1.device èìååò åäèíñòâåííûé ôîðìàò ïîñûëêè (÷òî ñëåäóåò èç
  1054. íàçâàíèÿ) è íå ïîçâîëÿåò åãî ìåíÿòü.
  1055.  
  1056.      parallel.device èñïîëüçóåò ñòðóêòóðó IOExtPar è ñâîé íàáîð êîìàíä
  1057. - ñìîòðèòå parallel.doc è <devices/parallel.#?>
  1058.  
  1059.      Îñòàëüíûå òèïû äåâàéñîâ ðàññìàòðèâàòüñÿ íå áóäóò - ÷èòàéòå
  1060. äîêóìåíòàöèþ ñàìîñòîÿòåëüíî.
  1061.  
  1062.  
  1063.  22) Ðàáîòà ñ äåâàéñàìè ïîñðåäñòâîì âûçîâà ôóíêöèé
  1064.  
  1065.      Ïîñûëêà êîìàíä íå ÿâëÿåòñÿ åäèíñòâåííûì ñðåäñòâîì ðàáîòû ñ
  1066. äåâàéñàìè.  Äëÿ îñóùåñòâëåíèÿ áûñòðîãî âûïîëíåíèÿ îïåðàöèé, áåç
  1067. ðàñõîäà âðåìåíè íà ïåðåñûëêó ñîîáùåíèé, ïðèìåíÿþòñÿ ôóíêöèè,
  1068. àíàëîãè÷íûå ôóíêöèÿì áèáëèîòåê.  Íàáîð ýòèõ ôóíêöèé ñïåöèôè÷åí
  1069. äëÿ êàæäîãî äåâàéñà.
  1070.  
  1071.      Ïîñêîëüêó OpenDevice() íå âîçâðàùàåò «áàçó» äåâàéñà, ïîñëå
  1072. îòêðûòèÿ äåâàéñà áàçó íóæíî ïðî÷èòàòü èç ñòðóêòóðû IORequest.
  1073. Íàõîäèòñÿ îíà â ïîëå io_Device ýòîé ñòðóêòóðû.  Êîãäà äåâàéñ óñïåøíî
  1074. îòêðûò, áàçà êîïèðóåòñÿ â ïåðåìåííóþ, ñïåöèôè÷íóþ äëÿ äåâàéñà -
  1075. íàïðèìåð, äëÿ timer.device ýòî áóäåò ïåðåìåííàÿ TimerBase.
  1076.  
  1077.      Ïîñëå ýòîãî ìîæíî âûïîëíÿòü ôóíêöèè äåâàéñà.  Êàêèå ôóíêöèè êàêîé
  1078. äåâàéñ ïðåäîñòàâëÿåò, îïèñàíî â äîêóìåíòàöèè ïî äåâàéñàì.
  1079.  
  1080.  
  1081.  23) Quick IO
  1082.  
  1083.      Êðîìå ñòàíäàðòíûõ îïåðàöèé ââîäà-âûâîäà, ñóùåñòâóåò òàêæå áûñòðûé
  1084. ââîä-âûâîä, ïðè êîòîðîì íå âûïîëíÿåòñÿ ïåðåñûëîê ñîîáùåíèé è ñðàçó
  1085. íàïðÿìóþ âûçûâàåòñÿ êîä äåâàéñà.  Ê ïðèìåðó, òàêîé ïîäõîä ïîëåçåí äëÿ
  1086. serial.device, êîãäà ïðèíèìàåìàÿ èíôîðìàöèÿ óæå ëåæèò â áóôåðå, è å¸
  1087. íóæíî òîëüêî ïåðåäàòü çàäà÷å.
  1088.      Ìåõàíèçì áûñòðîãî àñèíõðîííîãî ââîäà-âûâîäà ðåàëèçóåòñÿ ñëåäóþùèì
  1089. îáðàçîì:  â ïîëå io_Flags ñòðóêòóðû IORequest íóæíî óñòàíîâèòü ôëàã
  1090. IO_QUICK.  Çàòåì âìåñòî ñòàíäàðòíîãî SendIO() (î÷èùàþùåãî ýòî ïîëå)
  1091. íóæíî âûçâàòü ôóíêöèþ BeginIO() äåâàéñà.  Ïîñëå âûçîâà íóæíî ïðîâåðèòü
  1092. ôëàã IO_QUICK: åñëè ôëàã îñòàëñÿ óñòàíîâëåííûì, çíà÷èò îïåðàöèÿ óæå
  1093. çàâåðøåíà, è WaitIO() âûïîëíÿòü íå íóæíî.  Åñëè IO_QUICK ñáðîøåí,
  1094. çíà÷èò, îïåðàöèÿ íå ìîæåò áûòü çàâåðøåíà ñðàçó, è íóæíî îæèäàòü å¸
  1095. çàâåðøåíèÿ ñ ïîìîùüþ WaitIO().
  1096.      Ñ òî÷êè çðåíèÿ ïðîãðàììèñòà íà àññåìáëåðå, BeginIO() - ýòî âûçîâ
  1097. jsr -36(a0) - êàê îáû÷íî, â A6 äîëæíà ëåæàòü áàçà.  Ïîñêîëüêó ýòà
  1098. îïåðàöèÿ â ïðèíöèïå ìîæåò âûïîëíÿòüñÿ ñ ëþáûìè äåâàéñàìè, èìÿ áàçû íå
  1099. îïðåäåëåíî.  ×òîáû îáîéòè ýòîò ìîìåíò ïðè ïðîãðàììèðîâàíèè íà Ñè,
  1100. ïðèìåíÿåòñÿ ôóíêöèÿ BeginIO() ëèíêóåìîé áèáëèîòåêè amiga.lib,
  1101. âûçûâàþùàÿñÿ àíàëîãè÷íî ôóíêöèè SendIO() - êîòîðàÿ íå ìîæåò áûòü
  1102. ïðèìåíåíà äëÿ áûñòðîãî ââîäà-âûâîäà.
  1103.      Áûñòðûé ñèíõðîííûé ââîä-âûâîä äåëàåòñÿ ñ ïîìîùüþ óæå èçâåñòíîé
  1104. íàì DoIO(), ñ ïðåäâàðèòåëüíîé óñòàíîâêîé ôëàãà IO_QUICK.
  1105.  
  1106.  
  1107.  24) Ðàáîòà ñ òàéìåðîì
  1108.  
  1109.      Íåñêîëüêî îñîáíÿêîì ñðåäè äåâàéñîâ ñòîèò timer.device - îí íå
  1110. ÿâëÿåòñÿ ñðåäñòâîì ââîäà-âûâîäà.  Òàéìåð îïåðèðóåò ñâîé ñòðóêòóðîé
  1111. timerequest, èìååò ñâîè êîìàíäû, à òàêæå íàáîð ôóíêöèé.  Îòëè÷àåòñÿ îò
  1112. îáùåïðèíÿòîãî è ïðèìåíåíèå UNITîâ - ýòî íå «íîìåð óñòðîéñòâà», à
  1113. ðåæèì, â êîòîðîì ìû áóäåì èñïîëüçîâàòü òàéìåð.
  1114.  
  1115.      Òàéìåð óìååò ñ÷èòàòü âðåìÿ â äâóõ ðàçíûõ ñèñòåìàõ åäèíèö.  Ïåðâàÿ
  1116. ñèñòåìà îáùåïðèíÿòà - ýòî ñåêóíäû è ìèêðîñåêóíäû.  Îíè õðàíÿòñÿ â
  1117. ñòðóêòóðå timeval è ïðåäñòàâëÿþò ñîáîé äâà ëîíãà.  Ïðåäñòàâëåíèå
  1118. âðåìåíè âñåãäà íîðìàëèçîâàíî - ò.å., êîëè÷åñòâî ìèêðîñåêóíä íèêîãäà íå
  1119. ïðåâûøàåò ìèëëèîíà.
  1120.      Âòîðàÿ ñèñòåìà - òàê íàçûâàåìûå EClock. Ýòî âíóòðåííÿÿ åäèíèöà
  1121. âðåìåíè Àìèãè. ×àñòîòà EClock çàâèñèò îò ìîäåëè êîìïüþòåðà è îáû÷íî
  1122. ñîñòàâëÿåò ïîðÿäêà 7 ìåãàãåðö. EClock õðàíÿòñÿ â ñòðóêòóðå EClockVal,
  1123. ñîñòîÿùåé èç äâóõ ëîíãîâ - 64-áèòíîãî ïðåäñòàâëåíèÿ ÷èñëà.
  1124.  
  1125.      Òàéìåð èìååò äâà ýòàëîíà âðåìåíè - ñîáñòâåííî EClock (òî÷íîñòü
  1126. îïðåäåëÿåòñÿ ÷àñòîòîé EClock) è êàäðîâóþ ÷àñòîòó äèñïëåÿ (òî÷íîñòü
  1127. çàâèñèò îò ÷àñòîòû, îáû÷íî â ïðåäåëàõ 50-100Hz).  Âòîðîé âàðèàíò
  1128. èñïîëüçóåòñÿ òîãäà, êîãäà òî÷íîñòü íå èãðàåò îñîáîé ðîëè - íàïðèìåð,
  1129. äëÿ ìèãàíèÿ êóðñîðà. Ýòàëîí âðåìåíè íå èìååò îòíîøåíèÿ ê ñèñòåìå
  1130. åäèíèö - ìîæíî îïðåäåëÿòü âðåìÿ â ìèêðîñåêóíäàõ, èñïîëüçóÿ EClock.
  1131.  
  1132.      È íàêîíåö, òàéìåð èìååò äâà ðàçíûõ ðåæèìà ðàáîòû.  Îí óìååò êàê
  1133. îïåðèðîâàòü èíòåðâàëàìè âðåìåíè, òàê è ïîçâîëÿåò îæèäàòü íàñòóïëåíèÿ
  1134. îïðåäåë¸ííîãî âðåìåíè.
  1135.  
  1136.      Äëÿ òîãî, ÷òîáû èñïîëüçîâàòü ïðåäîñòàâëÿåìûå âîçìîæíîñòè, ïðè
  1137. îòêðûòèè timer.device íóæíî óêàçàòü Unit:
  1138.  
  1139.      UNIT_MICROHZ    - ðàáîòà ñ èíòåðâàëàìè âðåìåíè â ìèêðîñåêóíäàõ,
  1140.                        èñïîëüçóÿ â êà÷åñòâå ýòàëîíà EClock.
  1141.      UNIT_ECLOCK     - ðàáîòà ñ èíòåðâàëàìè âðåìåíè â åäèíèöàõ EClock
  1142.                        (ýòàëîí - ðàçóìååòñÿ, EClock)
  1143.      UNIT_VBLANK     - èíòåðâàëû âðåìåíè â ìèêðîñåêóíäàõ, ýòàëîí -
  1144.                        êàäðîâàÿ ÷àñòîòà
  1145.      UNIT_WAITUNTIL  - îæèäàíèå íàñòóïëåíèÿ çàäàííîãî âðåìåíè â
  1146.                        ìèêðîñåêóíäàõ, ýòàëîí - êàäðîâàÿ ÷àñòîòà
  1147.      UNIT_WAITECLOCK - îæèäàíèå íàñòóïëåíèÿ âðåìåíè â EClock,
  1148.                        ýòàëîí - EClock
  1149.  
  1150.      Ðàáîòà ñ timer.device îñóùåñòâëÿåòñÿ îïåðàöèåé TR_ADDREQUEST.
  1151. Åñëè òðåáóåòñÿ òîëüêî îæèäàíèå â òå÷åíèå íåêîòîðîãî èíòåðâàëà âðåìåíè
  1152. ñ ìàëîé òî÷íîñòüþ, âìåñòî âîçíè ñ òàéìåðîì ìîæíî èñïîëüçîâàòü ôóíêöèþ
  1153. dos.library Delay(), àðãóìåíòîì (D1) èìåþùóþ èíòåðâàë â «òèêàõ» (1/50
  1154. ñåêóíäû).  Íåîáõîäèìóþ ðàáîòó ñ òàéìåðîì ýòà ôóíêöèÿ âûïîëíèò ñàìà.
  1155.  
  1156.      Òàéìåð èìååò ðÿä âñïîìîãàòåëüíûõ ôóíêöèé äëÿ ðàáîòû ñ âðåìåíåì.
  1157. AddTime(), SubTime() è CmpTime() ïîëó÷àþò óêàçàòåëè íà èñõîäíóþ (A1) è
  1158. êîíå÷íóþ (A0) ñòðóêòóðó timeval è ïîçâîëÿþò ñêëàäûâàòü, âû÷èòàòü è
  1159. ñðàâíèâàòü âðåìÿ, ïîïóòíî îñóùåñòâëÿÿ íîðìàëèçàöèþ.
  1160.      Ôóíêöèÿ GetSysTime() âîçâðàùàåò â ñòðóêòóðå timeval, óêàçàòåëü íà
  1161. êîòîðóþ áûë åé ïåðåäàí (A0), òåêóùåå ñèñòåìíîå âðåìÿ.  Ôóíêöèÿ
  1162. ReadEClock() àíàëîãè÷íûì îáðàçîì çàïîëíÿåò ñòðóêòóðó EClockVal (A0) â
  1163. ôîðìàòå EClock, è âîçâðàùàåò (D0) ñèñòåìíóþ ÷àñòîòó EClock â ãåðöàõ.
  1164.  
  1165.      Êðîìå òîãî, äîñòóïíû êîìàíäû TR_GETSYSTIME è TR_SETSYSTIME äëÿ
  1166. ñ÷èòûâàíèÿ è óñòàíîâêè ñèñòåìíîãî âðåìåíè ñîîòâåòñòâåííî.
  1167.  
  1168.  
  1169.  25) Íåêîòîðûå îñîáåííîñòè èñïîëüçîâàíèÿ äåâàéñîâ
  1170.  
  1171.      Êàê è âñ¸ ïðî÷åå, ðàáîòà ñ äåâàéñàìè îðãàíèçîâàíà íà ñèãíàëàõ è
  1172. ñîîáùåíèÿõ.  Ýòî ïîçâîëÿåò îæèäàòü çàâåðøåíèÿ íåñêîëüêèõ çàïðîñîâ.
  1173. Î÷åâèäíî, íè÷òî íå ìåøàåò è îæèäàòü îäíîâðåìåííî êàê çàâåðøåíèÿ
  1174. ââîäà-âûâîäà, òàê è ëþáûõ äðóãèõ ñîîáùåíèé è ñèãíàëîâ.  Äëÿ ýòîãî
  1175. ïðèìåíÿéòå òîò æå ñïîñîá, ÷òî áûë îïèñàí ðàíåå äëÿ ïîðòîâ, èñïîëüçóÿ
  1176. ReplyPort.
  1177.  
  1178.      Ñóùåñòâîâàíèå àñèíõðîííîé ðàáîòû ñ äåâàéñîì íàòàëêèâàåò íà ìûñëü
  1179. î âîçìîæíîñòè ïîñûëêè ñðàçó íåñêîëüêèõ çàïðîñîâ åäèíîæäû îòêðûòîìó
  1180. äåâàéñó.  Îäíàêî, èñïîëüçîâàòü îäèí è òîò æå IORequest äëÿ ýòîãî
  1181. íåëüçÿ - ñòðóêòóðà äîëæíà áûòü íåèçìåííîé äî òåõ ïîð, ïîêà äåâàéñ íå
  1182. çàâåðøèò îïåðàöèþ.  ×òîáû íå îòêðûâàòü äëÿ ýòîãî äåâàéñ íåñêîëüêî ðàç,
  1183. èñïîëüçóåòñÿ ñëåäóþùèé «òðþê»: ñîçäàþòñÿ íîâûå ñòðóêòóðû IORequest
  1184. ïóò¸ì êîïèðîâàíèÿ â íèõ ñòàðîé.  Êàê óæå óïîìèíàëîñü, ïåðåä çàêðûòèåì
  1185. äåâàéñà âñå çàïðîñû äîëæíû áûòü çàâåðøåíû.
  1186.  
  1187.  
  1188.  26) New Style Devices
  1189.  
  1190.      Ïîñêîëüêó ñóùåñòâóåò íåñêîëüêî ðàçíûõ òèïîâ äåâàéñîâ, ñîâìåñòèìûõ
  1191. ñ ñîáîé òîëüêî íà óðîâíå ñòàíäàðòíûõ CMD-êîìàíä, áûëà áû ïîëåçíîé
  1192. âîçìîæíîñòü îïðåäåëèòü òèï äåâàéñà ïîñëå îòêðûòèÿ - íàïðèìåð, ÷òîáû
  1193. òåðìèíàëüíàÿ ïðîãðàììà íå âçäóìàëà âìåñòî serial.device èñïîëüçîâàòü
  1194. scsi.device.  Òàêàÿ âîçìîæíîñòü ïîÿâèëàñü áëàãîäàðÿ ñïåöèôèêàöèè NSD,
  1195. ïðèíÿòîé â 1996 ãîäó Amiga International.
  1196.  
  1197.      New Style Devices ïðè âûïîëíåíèè êîìàíäû NSCMD_DEVICEQUERY
  1198. âîçâðàùàþò ñïåöèôèêàöèþ äåâàéñà â ñòðóêòóðå NSDeviceQueryResult.
  1199. Óêàçàòåëü íà ýòó ñòðóêòóðó è å¸ ðàçìåð äîëæíû áûòü ïðåäâàðèòåëüíî
  1200. óêàçàíû â io_Data è io_Length.
  1201.  
  1202.      Ñòðóêòóðà ñîäåðæèò ñëåäóþùèå ïîëÿ:
  1203.  
  1204.      DevQueryFormat    - ïåðåä îïåðàöåé íóæíî îáíóëèòü
  1205.      SizeAvailable     - ïåðåä îïåðàöåé íóæíî îáíóëèòü
  1206.      DeviceType        - òèï äåâàéñà
  1207.      DeviceSubType     - ïîäòèï, â çàâèñèìîñòè îò òèïà
  1208.                          Çàðåçåðâèðîâàí äëÿ áóäóùåãî èñïîëüçîâàíèÿ,
  1209.                          â äàííûé ìîìåíò âñåãäà íóëåâîé
  1210.      SupportedCommands - óêàçàòåëü íà ìàññèâ 16-áèòíûõ ñëîâ,
  1211.                          îêàí÷èâàþùèõñÿ íóë¸ì - ñïèñîê âñåõ êîìàíä,
  1212.                          íå âûçûâàþùèõ îøèáêó IOERR_NOCMD.
  1213.  
  1214.      Ïîñëåäíåå ïîëå èçáàâëÿåò ïðîãðàììèñòà îò íåîáõîäèìîñòè ìåòîäîì
  1215. òûêà âûÿñíÿòü, ðàáîòàåò ëè òà èëè èíàÿ êîìàíäà, èëè íåò.
  1216.      Â íàñòîÿùèé ìîìåíò îïðåäåë¸í ñëåäóþùèé íàáîð òèïîâ äåâàéñîâ:
  1217.      <devices/newstyle.#?>
  1218.  
  1219.      NSDEVTYPE_GAMEPORT
  1220.      NSDEVTYPE_TIMER
  1221.      NSDEVTYPE_KEYBOARD
  1222.      NSDEVTYPE_INPUT
  1223.      NSDEVTYPE_TRACKDISK
  1224.      NSDEVTYPE_CONSOLE
  1225.      NSDEVTYPE_SANA2
  1226.      NSDEVTYPE_AUDIO
  1227.      NSDEVTYPE_CLIPBOARD
  1228.      NSDEVTYPE_PRINTER
  1229.      NSDEVTYPE_SERIAL
  1230.      NSDEVTYPE_PARALLEL
  1231.      NSDEVTYPE_UNKNOWN
  1232.  
  1233.      Êàòåãîðèÿ äåâàéñà ïîíÿòíà èç íàçâàíèÿ òèïà.  NSDEVTYPE_UNKNOWN
  1234. îçíà÷àåò äåâàéñ, íå ïîäïàäàþùèé íè ïîä îäíó èç ýòèõ êàòåãîðèé.
  1235.  
  1236.      Î÷åâèäíî, îïèñàííîå ðàñøèðåíèå ïîääåðæèâàåòñÿ òîëüêî äåâàéñàìè,
  1237. ñîçäàííûìè ïîñëå âûõîäà ýòîé ñïåöèôèêàöèè.  Åñëè êàêîé-òî êîíêðåòíûé
  1238. äåâàéñ ñëèøêîì ñòàð èëè ïî êàêîé-òî åù¸ ïðè÷èíå íå ïîääåðæèâàåò å¸,
  1239. ñëåäóåò ïîëüçîâàòüñÿ òîëüêî èìåþùèìèñÿ âîçìîæíîñòÿìè, âîçëîæèâ
  1240. îòâåòñòâåííîñòü çà ïðàâèëüíîñòü âûáîðà òèïà äåâàéñà íà ïîëüçîâàòåëÿ.
  1241.  
  1242.  
  1243.  27) Ðàáîòà ñ äàòàìè
  1244.  
  1245.      Ñèñòåìíîå âðåìÿ ïðåäñòàâëÿåò ñîáîé êîëè÷åñòâî âðåìåíè, ïðîøåäøåå
  1246. ñ äàòû 1 ÿíâàðÿ 1978 ãîäà.  Ïîñêîëüêó äëÿ ÷åëîâåêà ýòî âðåìÿ íè÷åãî íå
  1247. ñêàæåò, ñóùåñòâóþò ôóíêöèè, îïåðèðóþùèå ñ áîëåå ïðèâû÷íûì äëÿ âñåõ íàñ
  1248. ïðåäñòàâëåíèåì âðåìåíè.
  1249.  
  1250.      Ôóíêöèÿ DateStamp() dos.library çàïîëíÿåò ñòðóêòóðó DateStamp
  1251. <dos/dos.#?>, óêàçàòåëü íà êîòîðóþ åé ïåðåäàí (D1).  Ñòðóêòóðà
  1252. ñîäåðæèò öåëîå êîëè÷åñòâî äíåé, ïðîøåäøèõ ñ óïîìÿíóòîé äàòû (ds_Days),
  1253. êîëè÷åñòâî ìèíóò, ïðîøåäøèõ ñ ïîëóíî÷è (ds_Minute), è êîëè÷åñòâî
  1254. «òèêîâ» ïîñëåäíåé ìèíóòû (ds_Tick).
  1255.      Ôóíêöèÿ CompareDates() ïîçâîëÿåò ñðàâíèòü äâå äàòû (D1,D2),
  1256. ïðåäñòàâëåííûå ñòðóêòóðàìè DateStamp.
  1257.  
  1258.      Ôóíêöèè DateToStr() è StrToDate() ïåðåâîäÿò äàòó èç DateStamp â
  1259. ïðèâû÷íîå ÷åëîâå÷åñêîå ïðåäñòàâëåíèå è îáðàòíî.  Äëÿ ýòîãî
  1260. èñïîëüçóåòñÿ ñòðóêòóðà <dos/datetime.#?> DateTime
  1261. (D1), ñîäåðæàùàÿ â íà÷àëå ñòðóêòóðó DateStamp è äîïîëíèòåëüíî èìåþùàÿ
  1262. ðÿä ïîëåé, óïðàâëÿþùèõ ôîðìàòîì, ïîäñòàíîâêîé ñëîâ (íàçâàíèÿ äíåé
  1263. íåäåëè) è èìåþùàÿ óêàçàòåëè íà ðåçóëüòèðóþùèå ñòðîêè, êîòîðûå íóæíî
  1264. çàïîëíèòü çàðàíåå ïåðåä âûçîâîì ôóíêöèè.  Ïîäðîáíåå ñìîòðèòå dos.doc.
  1265.  
  1266.      Äðóãîå ñðåäñòâî - Date2Amiga() è Amiga2Date() â utility.library
  1267. ïîçâîëÿåò îïåðèðîâàòü íå òåêñòîâûìè ñòðîêàìè, à öèôðîâûì
  1268. ïðåäñòàâëåíèåì äàòû.  Ôóíêöèè ïðåîáðàçóþò êîëè÷åñòâî ñåêóíä (D0) â
  1269. ñòðóêòóðó (A0) ClockData <utility/date.#?> è îáðàòíî.  Ñòðóêòóðà
  1270. ñîäåðæèò ñëåäóþùèå ïîëÿ:
  1271.  
  1272.      sec   - ñåêóíäû
  1273.      min   - ìèíóòû
  1274.      hour  - ÷àñû
  1275.      mday  - äåíü ìåñÿöà
  1276.      month - ìåñÿö
  1277.      year  - ãîä
  1278.      wday  - äåíü íåäåëè
  1279.  
  1280.  
  1281.  28) DOS
  1282.  
  1283.      Äàëåå ïîéä¸ò ïîäðîáíîå îïèñàíèå ðàáîòû ñ dos.library (äàëåå
  1284. ïðîñòî DOS).  Ýòà áèáëèîòåêà çàíèìàåòñÿ ââîäîì-âûâîäîì íà áîëåå
  1285. âûñîêîì óðîâíå, ðàáîòîé ñ ôàéëàìè, ôàéëîâûìè ñèñòåìàìè è ïðî÷èì.
  1286.  
  1287.      DOS ââîäèò íîâîå ïîíÿòèå ÏÐÎÖÅÑÑ.  Ïðîöåññ - ýòî çàäà÷à (task),
  1288. èìåþùàÿ ðàñøèðåííûå ñëóæåáíûå ïîëÿ.  Ïðîöåññ îïèñûâàåòñÿ ñòðóêòóðîé
  1289. Process, êîòîðàÿ ïåðâûì ýëåìåíòîì ñîäåðæèò ñòðóêòóðó Task.  Íîâûå ïîëÿ
  1290. ñòðóêòóðû íåîáõîäèìû äëÿ ðàáîòû ñ DOS.  Òîëüêî ïðîöåññû èìåþò ïðàâî
  1291. âûçûâàòü áîëüøèíñòâî ôóíêöèé dos.library.  Âïðî÷åì, áîëüøèíñòâî çàäà÷,
  1292. êîòîðûå «êðóòÿòñÿ» â ñèñòåìå, ïðåäñòàâëÿþò ñîáîé èìåííî ïðîöåññû.
  1293. Îïèñàííîé ðàíåå ôóíêöèåé CreateNewProc() ñîçäà¸òñÿ èìåííî ïðîöåññ.
  1294.  
  1295.      Ïî èñòîðè÷åñêèì ïðè÷èíàì DOS èìååò ñëåäóþùóþ îñîáåííîñòü:
  1296. àðãóìåíòû áîëüøèíñòâà ôóíêöèé ïåðåäàþòñÿ â ðåãèñòðàõ äàííûõ.  Òàê
  1297. ïîëó÷èëîñü â ðåçóëüòàòå òîãî, ÷òî ïåðâûå âåðñèè DOS áûëè íàïèñàíû íå
  1298. íà Asm/C, à íà ÿçûêå BCPL.  Ïî òîé æå ïðè÷èíå â DOS äîñòàòî÷íî ÷àñòî
  1299. âñòðå÷àþòñÿ òàê íàçûâàåìûå BCPL-óêàçàòåëè, êîòîðûå ïðåäñòàâëÿþò ñîáîé
  1300. íîìåð ëîíãà (òî åñòü, äëÿ ïðåîáðàçîâàíèÿ â îáû÷íûé óêàçàòåëü íóæíî
  1301. ñäâèíóòü åãî âëåâî íà äâà ðàçðÿäà).
  1302.  
  1303.  
  1304.  29) Óñòðîéñòâà è ïóòè
  1305.  
  1306.      DOS àäðåñóåò óñòðîéñòâà ïî èõ èìåíàì.  Èìÿ - òåêñòîâàÿ ñòðîêà ñ
  1307. äâîåòî÷èåì â êîíöå.  Óñòðîéñòâîì ìîæåò áûòü âñ¸ ÷òî óãîäíî - äèñêåòà,
  1308. ïîñëåäîâàòåëüíûé ïîðò, êîíñîëüíîå îêíî.
  1309.      ×àñòíûì ñëó÷àåì óñòðîéñòâà ìîæåò áûòü èåðàðõè÷åñêàÿ äðåâîâèäíàÿ
  1310. ñòðóêòóðà, ñîäåðæàùàÿ ìíîæåñòâî ôàéëîâ.   Äëÿ âûÿñíåíèÿ, ÿâëÿåòñÿ ëè
  1311. äàííîå óñòðîéñòâî ôàéëîâûì, ñóùåñòâóåò ôóíêöèÿ IsFileSystem(), êîòîðîé
  1312. ïåðåäà¸òñÿ èìÿ óñòðîéñòâà (D1).  Ðåçóëüòàò - TRUE äëÿ ôàéëîâîé ñèñòåìû
  1313. èëè FALSE â ïðîòèâíîì ñëó÷àå.
  1314.  
  1315.      Äëÿ àäðåñàöèè ôàéëà â ïðåäåëàõ èåðàðõè÷åñêîé ôàéëîâîé ñèñòåìû
  1316. ñóùåñòâóþò ïóòè.  Ïóòü ìîæåò áûòü îòíîñèòåëüíûì èëè àáñîëþòíûì.
  1317. Ïîäðîáíî îá ýòîì ÷èòàéòå â êíèãå Ä.Ìèõàéëîâà.
  1318.  
  1319.      Äëÿ óäîáñòâà ðàáîòû ñ ïóòÿìè DOS ïðåäîñòàâëÿåò ðÿä ôóíêöèé:
  1320.  
  1321.      AddPart() äîáàâëÿåò èìÿ ôàéëà èëè ïóòü, çàäàííûé âòîðûì
  1322. àðãóìåíòîì (D2), ê ïóòè â áóôåðå (D1) îïðåäåë¸ííîãî ðàçìåðà (D3).
  1323. Åñëè äîáàâëÿåìûé ïóòü ÿâëÿåòñÿ àáñîëþòíûì, îí ïîëíîñòüþ çàìåùàåò
  1324. èñõîäíûé.  Ïîäðîáíåå ÷èòàéòå dos.doc.
  1325.      FilePart() èùåò ïîñëåäíèé êîìïîíåíò ïóòè.
  1326.      PathPart() íàõîäèò êîíåö ïðåäïîñëåäíåãî êîìïîíåíòà ïóòè, îáû÷íî -
  1327. èìåíè äèðåêòîðèè.
  1328.  
  1329.  
  1330.  30) Ìåõàíèçì çàïóñêà ïðîãðàìì â DOS
  1331.  
  1332.      Â AmigaOS ñóùåñòâóåò îáùåïðèíÿòûé ôîðìàò çàãðóæàåìîãî ôàéëà.
  1333. Îí èñïîëüçóåòñÿ íå òîëüêî äëÿ èñïîëíÿåìûõ ôàéëîâ - â ýòîì æå ôîðìàòå
  1334. õðàíÿòñÿ è áèáëèîòåêè, è äåâàéñû, è øðèôòû, è èêîíêè.  Ôàéë ñîñòîèò èç
  1335. ÕÀÍÊΠ(HUNKS), ïðåäñòàâëÿþùèõ ñîáîé îòäåëüíûå ó÷àñòêè.  Õàíêè ìîãóò
  1336. ñîäåðæàòü êîä, äàííûå, îòëàäî÷íóþ èíôîðìàöèþ, è òàáëèöû ïåðåìåùåíèÿ.
  1337. Ìåõàíèçì òàáëèö ïåðåìåùåíèÿ ïîçâîëÿåò çàãðóæàòü íåïåðåìåùàåìûå
  1338. ïðîãðàììû â ëþáûå àäðåñà ïàìÿòè, ìîäèôèöèðóÿ â íèõ ÿ÷åéêè, çàâèñÿùèå
  1339. îò àäðåñîâ - òàáëèöû ïåðåìåùåíèÿ ñîäåðæàò ñïèñîê ýòèõ ÿ÷ååê.
  1340.  
  1341.      Ðàçìåùåíèå çàãðóæàåìîãî ôàéëà â ïàìÿòè âûïîëíÿåòñÿ ôóíêöèåé
  1342. LoadSeg().  Åé ïåðåäà¸òñÿ óêàçàòåëü íà ñòðîêó - èìÿ ôàéëà (D1).
  1343. Ðåçóëüòàò LoadSeg() - BCPL-óêàçàòåëü íà òàê íàçûâàåìûé seglist.
  1344. Seglist (ñïèñîê ñåãìåíòîâ-õàíêîâ) ñîäåðæèò â ïåðâîì ëîíãå êàæäîãî
  1345. ñåãìåíòà BCPL-óêàçàòåëü íà ñëåäóþùèé ñåãìåíò.  Êîíåö ñïèñêà - íóëü.
  1346. LoadSeg() àâòîìàòè÷åñêè âûïîëíÿåò ïåðåìåùåíèå, ïîñëå å¸ óñïåøíîãî
  1347. âûïîëíåíèÿ çàãðóæàåìûé ôàéë ãîòîâ ê âûïîëíåíèþ.
  1348.      Êîãäà çàãðóæåííûé ôàéë â ïàìÿòè áîëåå íå íóæåí, âûïîëíÿåòñÿ
  1349. UnLoadSeg(), îñâîáîæäàþùèé çàíÿòóþ èì ïàìÿòü.
  1350.  
  1351.      Çàïóñê ïðîãðàììû DOS-îì ïðîèçâîäèòñÿ îïåðàöèåé jsr.  Ïðè ýòîì â
  1352. A0 ïðîãðàììå ïåðåäà¸òñÿ óêàçàòåëü íà êîìàíäíóþ ñòðîêó, à â D0 äëèíà.
  1353. Ñòðîêà îêàí÷èâàåòñÿ ñèìâîëîì LF.  Ñòðîêà ÍÅ ÑÎÄÅÐÆÈÒ èìÿ ïðîãðàììû,
  1354. òî åñòü íà÷èíàåòñÿ ñ ïåðâîãî æå å¸ àðãóìåíòà (èëè ñîäåðæèò òîëüêî LF,
  1355. åñëè àðãóìåíòîâ íåò).
  1356.      Ðåçóëüòàò ðàáîòû (returncode) ïðîãðàììà âîçâðàùàåò â D0.  Íóëü
  1357. îçíà÷àåò óñïåøíîå (áåç îøèáîê) çàâåðøåíèå ïðîãðàììû.
  1358.  
  1359.      ÂÀÆÍÎÅ ÇÀÌÅ×ÀÍÈÅ.  Workbench èñïîëüçóåò äðóãîé ìåõàíèçì ïåðåäà÷è
  1360. àðãóìåíòîâ!  Ïðèçíàêîì çàïóñêà ïðîãðàììû èç DOS ÿâëÿåòñÿ íåíóëåâîå
  1361. ïîëå óêàçàòåëÿ íà ñòðóêòóðó CommandLineInterface â ñòðóêòóðå Process.
  1362.      Ïðîâåðèòü ýòî ïîëå ìîæíî êàê «íàïðÿìóþ», âûïîëíèâ FindTask() ñ
  1363. íóëåâûì àðãóìåíòîì, òàê è ïî ðåçóëüòàòó Cli(), åñëè DOS îòêðûò.
  1364.  
  1365.  
  1366.  31) Çàïóñê è îñòàíîâ ïðîãðàììû
  1367.  
  1368.      ×òîáû çàïóñòèòü èç âàøåé ïðîãðàììû êàêóþ-òî åù¸, î÷åâèäíî, ìîæíî
  1369. ñàìîñòîÿòåëüíî âûïîëíèòü LoadSeg() è ïåðåäàòü åé óïðàâëåíèå.
  1370.      Íî ñóùåñòâóåò è áîëåå ïðîñòîé ñïîñîá çàïóñêà äðóãîé ïðîãðàììû -
  1371. SystemTags().  Àðãóìåíò - êîìàíäíàÿ ñòðîêà (D1) è taglist (D2).  Ïðè
  1372. âûïîëíåíèè ýòîé ôóíêöèè çàïóñêàåòñÿ òðåáóåìàÿ ïðîãðàììà, à ïî âûõîäó
  1373. èç í帠ôóíêöèÿ âîçâðàùàåò returncode.
  1374.      Òýãè, ïåðåäàâàåìûå ôóíêöèè, ïîçâîëÿþò ïåðåíàïðàâèòü å¸ ââîä è
  1375. âûâîä, óñòàíîâèòü èìÿ çàäà÷è, å¸ ïðèîðèòåò.  Èñïîëüçóþòñÿ òå æå òýãè,
  1376. ÷òî è ó CreateNewProc().
  1377.  
  1378.      DOS ïðåäîñòàâëÿåò âîçìîæíîñòü äîñòóïà ê ñïèñêó çàïóùåííûõ èç DOS
  1379. ïðîãðàìì.  Êàæäàÿ òàêàÿ ïðîãðàììà èìååò óíèêàëüíûé íîìåð, êîòîðûé
  1380. ïîçâîëÿåò èäåíòèôèöèðîâàòü äàæå ïðîöåññû ñ îäèíàêîâûìè èìåíàìè.
  1381. Íóìåðóþòñÿ îíè ñ ÅÄÈÍÈÖÛ.
  1382.      Äëÿ äîñòóïà ê ñïèñêó ñíà÷àëà íóæíî âûïîëíèòü ôóíêöèþ MaxCli(),
  1383. êîòîðàÿ âåðí¸ò ìàêñèìàëüíûé íîìåð ïðîöåññà, çàïóùåííîãî èç DOS.  Ýòî
  1384. íå êîëè÷åñòâî ïðîöåññîâ, ðÿä íîìåðîâ ìîæåò áûòü íåçàíÿòûì ïî ïðè÷èíå
  1385. çàâåðøåíèÿ ïðîãðàìì.  Ïîñëå ýòîãî â öèêëå îò åäèíèöû äî ðåçóëüòàòà
  1386. MacCli() âûïîëíÿåòñÿ FindCliProc(), ñ àðãóìåíòîì - ñ÷¸ò÷èêîì öèêëà
  1387. (D1).  Ðåçóëüòàòîì êàæäîãî âûçîâà áóäåò óêàçàòåëü íà î÷åðåäíîé ïðîöåññ
  1388. èëè íóëü, åñëè òàêîâîé îòñóòñòâóåò.
  1389.  
  1390.      Äëÿ îñòàíîâà êàêîé-ëèáî ïðîãðàììû íåîáõîäèìî ïîñëàòü åé ñèãíàë
  1391. SIGBREAKF_CTRL_C <dos/dos.#?>.  Îñòàíîâ â ýòîì ñëó÷àå íå
  1392. ãàðàíòèðóåòñÿ, îäíàêî ìíîãèå ïðîãðàììû ïîääåðæèâàþò ýòî ñîãëàøåíèå.
  1393.  
  1394.  
  1395.  32) Àðãóìåíòû êîìàíäíîé ñòðîêè
  1396.  
  1397.      Êàê îïèñàíî âûøå, ïðîãðàììà íå ïîëó÷àåò ñâèìÿ â êîìàíäíîé
  1398. ñòðîêå.  Âûÿñíèòü åãî ìîæíî ñ ïîìîùüþ ôóíêöèè GetProgramName(),
  1399. ïîëó÷àþùåé óêàçàòåëü íà áóôåð (D1) è åãî ðàçìåð (D2).
  1400.  
  1401.      Åñòü íåñêîëüêî ñïîñîáîâ ðàáîòû ñ êîìàíäíîé ñòðîêîé:
  1402.  
  1403.    - A0/D0.  Â ïðîãðàììå íà Ñè ãîëîâíàÿ ôóíêöèÿ çàäà¸òñÿ â âèäå:
  1404.  
  1405.      __asm main(register __a0 char *string, register __d0 int len)
  1406.  
  1407.      Ïåðâîå ñëîâî óêàçûâàþòñÿ òîëüêî äëÿ SAS/C.  Åñëè ïðîãðàììà
  1408.      êîìïèëèðóåòñÿ êàê A4-relative, òî äëÿ SAS/C ïåðåä __asm íóæíî
  1409.      óêàçàòü __saveds, à äëÿ Hisoft C ïåðâîé îïåðàöèåé â main() áóäåò
  1410.      GetBaseReg() - ïîäðîáíåå ÷èòàéòå â îïèñàíèè ñðåäñòâ ðàçðàáîòêè.
  1411.  
  1412.    - GetArgStr() âîçâðàùàåò (D0) òî æå, ÷òî è ïåðåäà¸òñÿ â A0 ïðè
  1413.      ñòàðòå ïðîãðàììû.  Â ýòîì ñëó÷àå âîçíÿ ñ àðãóìåíòàìè main() íå
  1414.      òðåáóåòñÿ.
  1415.  
  1416.    - ReadArgs().  Ýòî ñàìîå ìîùíîå è óäîáíîå ñðåäñòâî ðàáîòû ñ
  1417.      àðãóìåíòàìè.  ReadArgs() ïîëíîñòüþ ðàçáèðàåò êîìàíäíóþ ñòðîêó,
  1418.      ïðåâðàùàÿ å¸ â ìàññèâ ñòðîê, ÷èñåë è ôëàãîâ, ñîîòâåòñòâóþùèõ
  1419.      íàçíà÷åíèþ êëþ÷åâûõ ñëîâ.
  1420.  
  1421.  
  1422.  33) ReadArgs()
  1423.  
  1424.      ReadArgs() ðàçáèðàåò êîìàíäíóþ ñòðîêó â ñîîòâåòñòâèè ñ ïåðåäàííûì
  1425. åìó øàáëîíîì.  Øàáëîí çàäà¸ò ðàçëè÷íûå êëþ÷è êîìàíäíîé ñòðîêè è èõ
  1426. òèïû.  Øàáëîí ñîñòîèò èç ñïèñêà êëþ÷åé.  Êëþ÷è íàçûâàþòñÿ «ïîëíûìè»
  1427. èìåíàìè, ãäå ýòî âîçìîæíî (íàïðèìåð, «Quick» âìåñòî «Q»).  Òàêæå ìîãóò
  1428. áûòü çàäàíû ñîêðàùåíèÿ, ïóò¸ì èñïîëüçîâàíèÿ «ñîêðàùåíèå=êëþ÷»
  1429. (íàïðèìåð, «Q=Quick»).
  1430.      Êëþ÷è â øàáëîíå ðàçäåëÿþòñÿ çàïÿòûìè.  Äëÿ ïîëó÷åíèÿ ðåçóëüòàòà
  1431. ReadArgs(), Âû ïðîâåðÿåòå ìàññèâ ëîíãîâ, ïåðåäàííûé åìó (êàæäûé
  1432. ýëåìåíò ìàññèâà ñîîòâåòñòâóåò êëþ÷ó â øàáëîíå).  Ìàññèâ äîëæåí áûòü
  1433. î÷èùåí (ëèáî èíèöèàëèçèðîâàí çíà÷åíèÿìè ïî óìîë÷àíèþ) äî ïåðåäà÷è åãî
  1434. ReadArgs().  ×òî èìåííî áóäåò ïîìåùåíî â êîíêðåòíûé ýëåìåíò ìàññèâà,
  1435. îïðåäåëÿåòñÿ òèïîì êëþ÷à.  Ïî óìîë÷àíèþ ýòî áóäåò òåêñòîâàÿ ñòðîêà
  1436. (ïîñëåäîâàòåëüíîñòü ñèìâîëîâ, íå ñîäåðæàùàÿ ïðîáåëîâ, ëèáî çàêëþ÷¸ííàÿ
  1437. â êàâû÷êè) - â ýòîì ñëó÷àå ýëåìåíò ìàññèâà áóäåò ñîäåðæàòü óêàçàòåëü
  1438. íà ñòðîêó.
  1439.      Ïîñëå êàæäîãî êëþ÷à ìîæåò áûòü óêàçàí ñóôôèêñ, óêàçûâàþùèé åãî
  1440. òèï.  Ñóôôèêñû ñîñòîÿò èç «/» è îäèíî÷íîãî ñèìâîëà.  Ó êëþ÷à ìîæåò
  1441. áûòü íåñêîëüêî ñóôôèêñîâ.  Äîïóñòèìû ñëåäóþùèå ñóôôèêñû:
  1442.  
  1443.      /S - Ïåðåêëþ÷àòåëü (Switch).  Íàëè÷èå ðàññìàòðèâàåòñÿ êàê
  1444.           ëîãè÷åñêîå çíà÷åíèå, óñòàíàâëèâàþùååñÿ ïðè ïîÿâëåíèè â
  1445.           êîìàíäíîé ñòðîêå.  Ýëåìåíò ìàññèâà èìååò ëîãè÷åñêèé òèï
  1446.           (0 - íå óñòàíîâëåí, íåíóëåâîå çíà÷åíèå - óñòàíîâëåí).
  1447.      /K - Ñòðîêà (Keyword).  Ýëåìåíò ìàññèâà íå áóäåò çàïîëíåí, åñëè
  1448.           êëþ÷ íå óêàçàí.  Ê ïðèìåðó, åñëè â øàáëîíå óêàçàíî «Name/K»,
  1449.           òî ïðè îòñóòñòâèè «Name=<string>» èëè «Name <string>» â
  1450.           êîìàíäíîé ñòðîêå ýëåìåíò ìàññèâà íå áóäåò çàïîëíåí
  1451.      /N - ×èñëî (Number).  Ïàðàìåòð ðàññìàòðèâàåòñÿ êàê äåñÿòè÷íîå
  1452.           ÷èñëî, êîòîðîå áóäåò ïðåîáðàçîâàíî âûçîâîì ReadArgs.  Åñëè
  1453.           óêàçàíî íåâåðíîå çíà÷åíèå, âîçâðàùàåòñÿ îøèáêà.  Ýëåìåíò
  1454.           ìàññèâà áóäåò ñîäåðæàòü óêàçàòåëü íà ïîëó÷åííîå ÷èñëî
  1455.           (òàêèì îáðàçîì Âû óçíàåòå, áûëî ëè îíî óêàçàíî).
  1456.      /T - Ïåðåêëþ÷àòåëü (Toggle).  Ïîõîæ íà Switch, íî ïðè íàëè÷èè
  1457.           íå çàïîëíÿåò ýëåìåíò ìàññèâà, à «ïåðåêëþ÷àåò» åãî íà
  1458.           ïðîòèâîïîëîæíîå çíà÷åíèå.
  1459.      /A - Òðåáóåìûé (Required).  Ýòîò êëþ÷ äîëæåí áûòü óêàçàí â
  1460.           êîìàíäíîé ñòðîêå, ïðè åãî îòñóòñòâèè âîçâðàùàåòñÿ îøèáêà.
  1461.      /F - Îñòàòîê ñòðîêè.  Åñëè óêàçàí, îñòàòîê ñòðîêè ïîñëå êëþ÷à
  1462.           áóäåò ïåðåäàí êàê ïàðàìåòð, äàæå åñëè â í¸ì âñòðå÷àþòñÿ
  1463.           êàêèå-ëèáî åù¸ êëþ÷åâûå ñëîâà.
  1464.      /M - Ìíîæåñòâî ñòðîê (Multiple strings).  Ïàðàìåòðîì ÿâëÿåòñÿ
  1465.           ëþáîå êîëè÷åñòâî ñòðîê, âîçâðàùàåìîå â âèäå óêàçàòåëÿ íà
  1466.           ìàññèâ ñòðîê, çàêàí÷èâàþùèéñÿ íóëåâûì óêàçàòåëåì.  Ëþáîé
  1467.           àðãóìåíò, íå ÿâëÿþùèéñÿ ÷àñòüþ äðóãîãî àðãóìåíòà, áóäåò
  1468.           äîáàâëåí â ýòîò ìàññèâ.  Òîëüêî îäèí /M ìîæåò áûòü óêàçàí
  1469.           â øàáëîíå.  Ïðèìåð: äëÿ øàáëîíà «Dir/M,All/S» êîìàíäíàÿ
  1470.           ñòðîêà «foo bar all qwe» óñòàíîâèò ëîãè÷åñêèé ýëåìåíò «all»,
  1471.           è âåðí¸ò ìàññèâ ñòðîê, ñîäåðæàùèé «foo», «bar», and «qwe».
  1472.  
  1473.      Ñóùåñòâóåò âçàèìîäåéñòâèå ìåæäó ïàðàìåòðàìè /M è /A.  Åñëè ïîñëå
  1474. ðàçáîðà îñòàþòñÿ íåçàïîëíåííûå ïàðàìåòðû /A, îíè áóäóò çàïîëíåíû
  1475. ñòðîêàìè ñ êîíöà ñïèñêà ïðåäûäóùåãî ïàðàìåòðà /M.  Ýòî èñïîëüçóåòñÿ
  1476. äëÿ ñëó÷àåâ òèïà Copy («From/A/M,To/A»).
  1477.  
  1478.      Àðãóìåíòû ReadArgs() - óêàçàòåëü íà øàáëîí (D1), óêàçàòåëü íà
  1479. çàïîëíÿåìûé ìàññèâ (D2) è óêàçàòåëü íà ñòðóêòóðó RDargs (D3).  Îáû÷íî
  1480. òðåòüèì àðãóìåíòîì ïåðåäàþò 0.  Ôóíêöèÿ ïîäðîáíî îïèñàíà â dos.doc.
  1481.  
  1482.      Êàæäûé âûçîâ ReadArgs() äîëæåí çàâåðøàòüñÿ âûçîâîì FreeArgs(),
  1483. êîòîðûé îñâîáîäèò çàíÿòóþ ReadArgs() ïàìÿòü.
  1484.  
  1485.  
  1486.  34) Ïåðåìåííûå îêðóæåíèÿ
  1487.  
  1488.      Ïåðåìåííûå - åù¸ îäèí ñïîñîá êàê ïåðåäà÷è ïðîãðàììå àðãóìåíòîâ,
  1489. òàê è ïîëó÷åíèÿ îò í帠ðåçóëüòàòà.  Êðîìå òîãî, ýòî îñíîâíîå ñðåäñòâî
  1490. õðàíåíèÿ äàííûõ â shell-ñêðèïòàõ, à òàêæå ìåõàíèçì õðàíåíèÿ alias-îâ
  1491. êîìàíä.
  1492.  
  1493.      Ïåðåìåííûå ìîãóò áûòü ËÎÊÀËÜÍÛÌÈ è ÃËÎÁÀËÜÍÛÌÈ.  Ëîêàëüíûå
  1494. ïåðåìåííûå â äàííûé ìîìåíò äîñòóïíû òîëüêî îäíîé çàäà÷å.  Îíè
  1495. ñîõðàíÿþòñÿ âñ¸ âðåìÿ ðàáîòû shell-ñêðèïòà è äîñòóïíû âñåì ïðîãðàììàì,
  1496. çàïóñêàåìûì èç ýòîãî ñêðèïòà.  Íåñêîëüêî ðàçíûõ çàäà÷ îäíîâðåìåííî
  1497. ìîãóò èìåòü ðàçíûå ïåðåìåííûå ñ îäèíàêîâûìè èìåíàìè, ïîñêîëüêó
  1498. ðàáîòàþò â ðàçíûõ shell-ïðîöåññàõ.
  1499.      Ãëîáàëüíûå ïåðåìåííûå (îíè æå ïåðåìåííûå îêðóæåíèÿ - environment)
  1500. ãëîáàëüíû äëÿ âñåé ñèñòåìû. Ïåðåìåííàÿ, óñòàíîâëåííàÿ èç îäíîé çàäà÷è,
  1501. áóäåò âèäíà äðóãîé çàäà÷å.
  1502.      Ïåðåìåííûå ñîäåðæàò ïðîèçâîëüíóþ èíôîðìàöèþ. Ðåêîìåíäóåòñÿ, ÷òîáû
  1503. ýòî áûë ASCII òåêñò - íî ýòî íå ÿâëÿåòñÿ îáÿçàòåëüíûì òðåáîâàíèåì.
  1504.      Ïåðåìåííûå èäåíòèôèöèðóþòñÿ èìåíåì, êîòîðîå ñîîòâåòñòâóåò ôîðìàòó
  1505. èì¸í ôàéëîâîé ñèñòåìû.
  1506.  
  1507.      SetVar() ïðèñâàèâàåò ïåðåìåííîé îïðåäåë¸ííîå çíà÷åíèå.  Åñëè
  1508. ïåðåìåííàÿ åù¸ íå ñóùåñòâóåò, îíà ñîçäà¸òñÿ.  Àðãóìåíòû - èìÿ
  1509. ïåðåìåííîé (D1), áóôåð äàííûõ è åãî ðàçìåð (D2, D3), è ôëàãè (D4).
  1510. Ôëàãè ñîäåðæàò òèï ïåðåìåííîé LV_VAR (ïåðåìåííàÿ) èëè LV_ALIAS (alias
  1511. shell-êîìàíä), è îáëàñòü äåéñòâèÿ GVF_LOCAL_ONLY èëè GVF_GLOBAL_ONLY
  1512. <dos/var.#?>.
  1513.  
  1514.      GetVar() âîçâðàùàåò çíà÷åíèå ïåðåìåííîé ïî èìåíè. Àðãóìåíòû - èìÿ
  1515. (D1), çàïîëíÿåìûé áóôåð (D2) è åãî ðàçìåð (D3), è ôëàãè (D4).  Ôëàãè
  1516. ïîçâîëÿþò ñ÷èòûâàòü íå-ASCII ïåðåìåííóþ, ÷òîáû áóôåð íå îêàí÷èâàëñÿ
  1517. êîäîì LF (GVF_BINARY_VAR) è íóë¸ì (GVF_DONT_NULL_TERM), à òàêæå
  1518. çàäàâàèòü îáëàñòü âèäèìîñòè (GVF_LOCAL_ONLY èëè GVF_GLOBAL_ONLY).  Ïî
  1519. óìîë÷àíèþ ñíà÷àëà èùåòñÿ ëîêàëüíàÿ ïåðåìåííàÿ, è òîëüêî åñëè îíà íå
  1520. íàéäåíà, èùåòñÿ ãëîáàëüíàÿ.
  1521.      Ðåçóëüòàò - äëèíà ïåðåìåííîé èëè -1, åñëè îíà íå íàéäåíà.
  1522.  
  1523.      DeleteVar() óäàëÿåò çàäàííóþ èìåíåì (D1) ïåðåìåííóþ.  Ôëàãè (D2)
  1524. ïîçâîëÿþò óêàçàòü îáëàñòü äåéñòâèÿ (GVF_LOCAL_ONLY, GVF_GLOBAL_ONLY).
  1525. LV_VAR - åäèíñòâåííûé òèï, êîòîðûé ìîæåò áûòü ãëîáàëüíûì.
  1526.  
  1527.      FindVar() ïî èìåíè (D1) è òèïó (D2) âîçâðàùàåò óêàçàòåëü íà
  1528. ñòðóêòóðó LocalVar, îïèñûâàþùóþ ëîêàëüíóþ ïåðåìåííóþ.
  1529.  
  1530.  
  1531.  35) Ðàáîòà ñ ôàéëàìè
  1532.  
  1533.      Ðàáîòà ñ ôàéëàìè îñóùåñòâëÿåòñÿ ôóíêöèÿìè dos.library:
  1534.  
  1535.      Open()  - îòêðûòèå ôàéëà
  1536.      Close() - çàêðûòèå ôàéëà
  1537.      Read()  - ÷òåíèå èç ôàéëà
  1538.      Write() - çàïèñü â ôàéë
  1539.  
  1540.      Àðãóìåíòàìè Open() ÿâëÿþòñÿ èìÿ (D1) è ðåæèì äîñòóïà (D2).  Èìÿ
  1541. ìîæåò ñîäåðæàòü ïóòü ê ôàéëó, ïóòü ìîæåò áûòü êàê àáñîëþòíûì, òàê è
  1542. îòíîñèòåëüíûì - îòíîñèòåëüíî òåêóùåé äèðåêòîðèè.  Ôóíêöèè ðàáîòàþò êàê
  1543. ñ ôàéëàìè íà äèñêàõ, òàê è ñ ëþáûìè óñòðîéñòâàìè - êîòîðûìè ìîãóò áûòü
  1544. «SER:» (ïîñëåäîâàòåëüíûé ïîðò), «PAR:» (ïàðàëëåëüíûé ïîðò) è ò.ä.
  1545. Òàêèì îáðàçîì, Read() è Write() îïåðèðóþò ïðîèçâîëüíûìè ïîòîêàìè
  1546. äàííûõ.  Ðåæèì äîñòóïà - êîíñòàíòà, îïðåäåëÿþùàÿ ðåæèì ðàáîòû:
  1547. MODE_OLDFILE îòêðûâàåò ñóùåñòâóþùèé ôàéë (è âîçâðàùàåò îøèáêó, åñëè
  1548. ôàéë íå íàéäåí), MODE_NEWFILE ñîçäà¸ò íîâûé ôàéë (è óäàëÿåò ñòàðûé ñ
  1549. òàêèì æå èìåíåì ïðè åãî íàëè÷èè), MODE_READWRITE ñîçäà¸ò íîâûé ïðè
  1550. îòñóòñòâèè è îòêðûâàåò èìåþùèéñÿ ïðè íàëè÷èè.  Êîíñòàíòû îïèñàíû â
  1551. <dos/dos.#?>.
  1552.      Ôóíêöèåé Open() âîçâðàùàåòñÿ filehandle - óíèêàëüíîå 32-áèòíîå
  1553. ÷èñëî, èäåíòèôèöèðóþùåå îòêðûòûé ôàéë.  Ñ ýòîãî ìîìåíòà ëþáûì
  1554. îïåðàöèÿì íàä ýòèì ôàéëîì ïåðåäà¸òñÿ èìåþùèéñÿ filehandle. Çàâåðøàåòñÿ
  1555. ðàáîòà ñ ôàéëîì ôóíêöèåé Close(), òàêæå ïîëó÷àþùåé filehandle (D1).
  1556. Ïîñëå ýòîãî çíà÷åíèå filehandle íåäåéñòâèòåëüíî, è âñÿêèå ïîïûòêè
  1557. ðàáîòàòü ñ íèì ìîãóò âûçâàòü ñáîé ñèñòåìû.
  1558.      ×òåíèå îñóùåñòâëÿåòñÿ ôóíêöèåé Read().  Å¸ àðãóìåíòàìè ñëóæàò
  1559. filehandle (D1), óêàçàòåëü íà áóôåð â ïàìÿòè (D2) è òðåáóåìûé îáú¸ì
  1560. (D3).  Åñëè îïåðàöèÿ âûïîëíåíà óñïåøíî, Read() âîçâðàùàåò îáú¸ì
  1561. ðåàëüíî ïðî÷èòàííûõ äàííûõ.  Ýòîò îáú¸ì ìîæåò áûòü ìåíüøå
  1562. çàïðîøåííîãî.  Ýòî íå ÿâëÿåòñÿ îøèáêîé - íàïðèìåð, ïðè ïîïûòêå ÷òåíèÿ
  1563. 100 áàéò èç 50-áàéòíîãî ôàéëà ðåçóëüòàòîì áóäåò ðåàëüíàÿ äëèíà ôàéëà.
  1564. Åñëè îïåðàöèÿ çàâåðøèëàñü ñ îøèáêîé, â ðåçóëüòàòå âîçâðàùàåòñÿ -1.
  1565.      Çàïèñü îñóùåñòâëÿåòñÿ ôóíêöèåé Write(), ïî ôîðìàòó âûçîâà è
  1566. ðåçóëüòàòàì àíàëîãè÷íîé ôóíêöèè Read().
  1567.  
  1568.      Íåñêîëüêî ïîñëåäîâàòåëüíûõ çàïðîñîâ ÷òåíèÿ ÷èòàþò ñëåäóþùèå äðóã
  1569. çà äðóãîì ó÷àñòêè ôàéëà.  DOS çàïîìèíàåò òåêóùóþ ïîçèöèþ â ôàéëå è
  1570. ïîñëå êàæäîãî çàïðîñà ñäâèãàåò å¸ âïåð¸ä íà ïðî÷èòàííîå êîëè÷åñòâî
  1571. áàéò.  Ñóùåñòâóåò âîçìîæíîñòü ïåðåäâèíóòü å¸ «âðó÷íóþ», íàïðèìåð äëÿ
  1572. ïîâòîðíîãî ÷òåíèÿ òîãî æå ó÷àñòêà ôàéëà - äëÿ ýòîãî ñëóæèò ôóíêöèÿ
  1573. Seek(), àðãóìåíòû êîòîðîé - filehandle (D1), íîâàÿ ïîçèöèÿ â ôàéëå
  1574. (D2) è ðåæèì (D3).  Ðåæèì - îäíà èç êîíñòàíò <dos/dos.#?>:
  1575.  
  1576.      OFFSET_BEGINNING
  1577.      OFFSET_CURRENT
  1578.      OFFSET_END
  1579.  
  1580.      ÷òî ïîçâîëÿåò àäðåñîâàòüñÿ îò íà÷àëà ôàéëà, îò òåêóùåé ïîçèöèè â
  1581. í¸ì èëè îò êîíöà ôàéëà.  Ïîñêîëüêó filehandle ìîæåò ñîîòâåòñòâîâàòü
  1582. ïðîèçâîëüíîìó ïî ñâîåé ñóòè ïîòîêó, Seek() ðàáîòàåò íå âî âñåõ ñëó÷àÿõ
  1583. - íàïðèìåð, ïðè ïîïûòêå âûçîâà åãî íà «SER:» âåðí¸òñÿ îøèáêà.
  1584.  
  1585.      Ïîçèöèþ â ôàéëå íåëüçÿ ñäâèãàòü çà åãî ïðåäåëû.  Åñëè íåîáõîäèìî
  1586. ñîçäàòü íà äèñêå ôàéë çàäàííîé äëèíû áåç çàòðàò âðåìåíè íà çàïèñü,
  1587. èñïîëüçóåòñÿ ôóíêöèÿ SetFileSize(), êîòîðîé ïåðåäà¸òñÿ filehandle
  1588. (D1), ïîçèöèÿ êîíöà ôàéëà (D2) è ðåæèì (D3), àíàëîãè÷íûé ðåæèìàì
  1589. Seek(). Ýòà æå ôóíêöèÿ ïîçâîëÿåò è «îáêóñûâàòü» ñóùåñòâóþùèå ôàéëû.
  1590.  
  1591.      Î×ÅÍÜ ÂÀÆÍÎÅ ÇÀÌÅ×ÀÍÈÅ.  Íå ñëåäóåò ïóòàòü ñðåäñòâà ðàáîòû ñ
  1592. ôàéëàìè DOS è ANSI C.  Òî, ÷òî âîçâðàùàþò ôóíêöèè òèïà fopen(), íå
  1593. èìååò îòíîøåíèÿ ê filehandle, õîòÿ è ïðåäíàçíà÷åíû äëÿ òîãî æå!
  1594.  
  1595.  
  1596.  36) Áóôåðèçîâàííûé ââîä-âûâîä
  1597.  
  1598.      Âñÿêàÿ îïåðàöèÿ ñ ôóíêöèÿìè Read() è Write() ìîæåò âûçâàòü
  1599. îáðàùåíèå ê äèñêó.  Òàêèì îáðàçîì, íàïðèìåð, çàïèñü ïîðöèÿìè ïî 10
  1600. áàéò âûçîâåò äëÿ êàæäîãî îáðàùåíèå ñ÷èòûâàíèå òåêóùåãî áëîêà,
  1601. ìîäèôèêàöèþ ýòèõ 10 áàéò è çàïèñü áëîêà.  Â èòîãå, äëÿ ðÿäà îïåðàöèé
  1602. îïèñàííûé âûøå ïîäõîä (íàçûâàåìûé íåáóôåðèçîâàííûì ââîäîì-âûâîäîì)
  1603. ÷ðåçâû÷àéíî íåýôôåêòèâåí.
  1604.      Äëÿ ïîâûøåíèÿ ýôôåêòèâíîñòè òàêèõ îïåðàöèé ïðèìåíÿåòñÿ
  1605. áóôåðèçîâàííûé ââîä-âûâîä.  Â ýòîì ñëó÷àå äàííûå ñ÷èòûâàþòñÿ ïîáëî÷íî
  1606. â áóôåð, à ïîðöèè íåáîëüøîãî ðàçìåðà âûäàþòñÿ óæå èç áóôåðà, íå òðåáóÿ
  1607. ëèøíèõ îáðàùåíèé ê äèñêó.  Òàê, è ïðè çàïèñè, ñîäåðæèìîå áóôåðà
  1608. ñáðàñûâàåòñÿ íà äèñê òîëüêî ïðè åãî çàïîëíåíèè.
  1609.  
  1610.      Ôóíêöèè FRead() è FWrite() ÿâëÿþòñÿ áóôåðèçîâàííûìè àíàëîãàìè
  1611. Read() è Write(), ñ òîé ëèøü ðàçíèöåé, ÷òî åù¸ îäíèì èõ àðãóìåíòîì
  1612. ÿâëÿåòñÿ êîëè÷åñòâî áëîêîâ (D4), äëèíà êîòîðûõ çàäàíà òðåòüèì.
  1613. Ðåçóëüòàò â ñëó÷àå óñïåøíîãî çàâåðøåíèÿ - êîëè÷åñòâî áëîêîâ.
  1614.      Ôóíêöèÿ FGetC() ñ÷èòûâàåò åäèíñòâåííûé ñèìâîë, ïîëó÷àÿ íà âõîäå
  1615. filehandle (D1), à ôóíêöèÿ FPutC() çàïèñûâàåò ñèìâîë, óêàçàííûé âòîðûì
  1616. àðãóìåíòîì (D2).  Ôóíêöèè FGets() è FPuts() âûïîëíÿþò òî æå ñàìîå äëÿ
  1617. ñòðîê, âòîðîé àðãóìåíò - óêàçàòåëü íà ñòðîêó (D2), ó FGets() òðåòüèì
  1618. àðãóìåíòîì (D3) èä¸ò îáú¸ì áóôåðà, âûäåëåííîãî ïîä ñòðîêó.
  1619.  
  1620.      Ôóíêöèÿ Flush() ñáðàñûâàåò íå çàïîëíåííûé äî êîíöà áóôåð â
  1621. âûõîäíîé ïîòîê.  Åñëè ýòîãî íå ñäåëàòü, ïîòîê áóäåò íå ñáðîøåí, è, ê
  1622. ïðèìåðó, îêîí÷àíèå òåêñòà â êîíñîëüíîå îêíî áóäåò âûâåäåíî òîëüêî
  1623. ïîñëå çàêðûòèÿ ôàéëà, à íå íåïîñðåäñòâåííî ïîñëå åãî âûâîäà.
  1624.  
  1625.      Áóôåðèçîâàííûé è íåáóôåðèçîâàííûé ââîä-âûâîä ìîæíî ÷åðåäîâàòü íà
  1626. îäíîì è òîì æå ôàéëå.  Ãëàâíîå - ïîìíèòü, ÷òî ïåðåä êàæäûì ïåðåõîäîì
  1627. íà íåáóôåðèçîâàííûé âûâîä ñëåäóåò ÎÁßÇÀÒÅËÜÍΠâûïîëíèòü Flush()!
  1628.  
  1629.      SetVBuf() óïðàâëÿåò ðàáîòîé áóôåðèçàöèè.  Àðãóìåíòû - filehandle
  1630. (D1), óêàçàòåëü íà áóôåð (D2), ðåæèì áóôåðèçàöèè (D3) è ðàçìåð áóôåðà
  1631. (D4).  Åñëè óêàçàòåëü íà áóôåð íóëåâîé, DOS ñàì áóäåò çàõâàòûâàòü
  1632. ïàìÿòü ïîä áóôåð, ïðåäâàðèòåëüíî îñâîáîæäàÿ ïðåäûäóùèé.  Åñëè óêàçàí
  1633. ðàçìåð -1, áóäåò èçìåí¸í òîëüêî ðåæèì áóôåðèçàöèè.
  1634.      Äîñòóïíû ñëåäóþùèå ðåæèìû áóôåðèçàöèè <dos/stdio.#?>:
  1635.  
  1636.      BUF_LINE - áóôåð ñáðàñûâàåòñÿ ïîñëå êàæäîé ñòðîêè
  1637.      BUF_FULL - áóôåð ñáðàñûâàåòñÿ òîëüêî ïî çàïîëíåíèþ èëè Flush()
  1638.      BUF_NONE - áóôåðèçàöèÿ îòêëþ÷åíà
  1639.  
  1640.      Ñëåäóåò îòìåòèòü, ÷òî îïèñàííûé áóôåðèçîâàííûé ââîä-âûâîä òàêæå
  1641. íåýôôåêòèâåí äëÿ îïåðàöèé ñ áîëüøèìè ìàññèâàìè, ïîñêîëüêó ôàêòè÷åñêè
  1642. òðåáóåò äâîéíîãî êîïèðîâàíèÿ - â áóôåð è â ïàìÿòü çàäà÷è.
  1643.  
  1644.  
  1645.  37) Ðàáîòà ñ êîíñîëüþ
  1646.  
  1647.      Shell-îêíî, èç êîòîðîãî çàïóñêàåòñÿ ïðîãðàììà, ôàêòè÷åñêè òîæå
  1648. ïðåäñòàâëÿåò ñîáîé ôàéë.  Òî÷íåå, ýòî äâà ôàéëà, íà ââîä è íà âûâîä
  1649. (â ñòàíäàðòå ANSI C èì ñîîòâåòñòâóþò ïîòîêè stdin è stdout).  Ýòè äâà
  1650. ôàéëà âñåãäà (ïîêà ðàáîòàåò ïðîãðàììà) îòêðûòû.  Ñîîòâåòñòâóþùèå
  1651. èì filehandles ìîæíî ïîëó÷èòü ôóíêöèÿìè dos.library Input() è Output()
  1652. ñîîòâåòñòâåííî.  Ñ íèìè ðàáîòàþò âñå îïèñàííûå âûøå ñðåäñòâà DOS.  Ïî
  1653. çàâåðøåíèþ ðàáîòû ñ íèìè, â îòëè÷èå îò îòêðûòûõ Âàìè ôàéëîâ, ýòè
  1654. filehandles çàêðûâàòü ÍÅËÜÇß!
  1655.  
  1656.      Äëÿ âûâîäà â êîíñîëü îáû÷íî ïðèìåíÿþò ìåõàíèçì ôîðìàòíûõ ñòðîê.
  1657. Ôîðìàòíàÿ ñòðîêà - ýòî âûâîäèìûé òåêñò, êîòîðûé «ðàçáàâëåí» ðàçëè÷íûìè
  1658. óïðàâëÿþùèìè ïîñëåäîâàòåëüíîñòÿìè. Îíè íà÷èíàþòñÿ ñ ñèìâîëà «ïðîöåíò»
  1659. è ïðè âûâîäå çàìåíÿþòñÿ ïîäñòðîêàìè, ÷èñëàìè â ðàçíûõ ñèñòåìàõ
  1660. ñ÷èñëåíèÿ è ò.ï. Áîëåå ïîäðîáíî îá ýòîì ìîæíî ïðî÷èòàòü â ëþáîé êíèãå
  1661. ïî ÿçûêó Ñè.
  1662.      Îáðàáîòêà ôîðìàòíûõ ñòðîê íà íèçêîì óðîâíå â AmigaOS âûïîëíÿåòñÿ
  1663. ôóíêöèåé Exec RawDoFmt().  Å¸ àðãóìåíòû - ôîðìàòíàÿ ñòðîêà (A0),
  1664. óêàçàòåëü íà ìàññèâ àðãóìåíòîâ (A1), óêàçàòåëü íà ôóíêöèþ âûâîäà (A2)
  1665. è ïåðåäàâàåìûé åé óêàçàòåëü (A3).  RawDoFmt() ìîæåò ðàáîòàòü ñ
  1666. ôîðìàòíîé ñòðîêîé, âûâîäÿ ðåçóëüòàò ôîðìàòèðîâàíèÿ êóäà óãîäíî - â
  1667. ôàéë, â ïàìÿòü è ò.ï., ïîçâîëÿÿ îòñëåäèòü òàêèå ÿâëåíèÿ, êàê
  1668. ïåðåïîëíåíèå áóôåðà.  Âûâîä ðåçóëüòàòà âåä¸òñÿ ïîñèìâîëüíî, äëÿ ýòîãî
  1669. âûçûâàåìàÿ ïî óêàçàòåëþ â òðåòüåì àðãóìåíòå ôóíêöèÿ ïîëó÷àåò î÷åðåäíîé
  1670. ñèìâîë â ðåãèñòðå D0.  Êëàññè÷åñêèé âèä ýòîé ôóíêöèè:
  1671.  
  1672.      move.l d0,(a3)+
  1673.      rts
  1674.  
  1675.      Â òàêîì ñëó÷àå ðåçóëüòèðóþùàÿ ñòðîêà áóäåò ðàçìåùåíà â ïàìÿòè ïî
  1676. àäðåñó, óêàçàííîìó ÷åòâ¸ðòûì àãðóìåíòîì RawDoFmt().  Ïðè íàïèñàíèè
  1677. ïðîãðàììû íà Ñè ýòó ôóíêöèþ ìîæíî íàïèñàòü îòäåëüíî íà àññåìáëåðå.
  1678. Òî, ÷òî ïîëó÷èòñÿ â ðåçóëüòàòå, ÿâëÿåòñÿ íåêèì ïîäîáèåì ôóíêöèè
  1679. sprintf() ANSI C, íî ïðè ýòîì íå òðåáóåò ëèíêîâêè ñ ïðîãðàììîé
  1680. êèëîáàéò íåíóæíîãî êîäà.
  1681.      Ñïåöèôèêàöèÿ ôîðìàòíûõ ñòðîê, èñïîëüçóåìûõ ôóíêöèåé RawDoFmt(),
  1682. ïî ñðàâíåíèþ ñ îïèñàííîé â ñòàíäàðòå Ñè íåñêîëüêî óïðîùåíà - â
  1683. ÷àñòíîñòè, íå ïîääåðæèâàþòñÿ ÷èñëà ñ ïëàâàþùåé òî÷êîé (âïðî÷åì, íà
  1684. ïðàêòèêå ïðèìåíÿåìûå èñêëþ÷èòåëüíî ðåäêî).  Áîëåå ïîäðîáíî ýòîò âîïðîñ
  1685. îñâåù¸í â exec.doc.
  1686.  
  1687.      Áîëåå âûñîêîóðîâíåâîé ôóíêöèåé DOS ÿâëÿåòñÿ Printf(), ïî ñóòè -
  1688. àíàëîã ñèøíîãî printf().  Àðãóìåíòû åãî òå æå - ôîðìàòíàÿ ñòðîêà (D1)
  1689. è íàáîð àðãóìåíòîâ (D2 - äëÿ íåçíàêîìûõ ñ ýòîé ôóíêöèåé èìååò ñìûñë
  1690. èçó÷èòü ñèøíóþ äîêóìåíòàöèþ).  Òàêæå äîñòóïåí FPrintf(), ïåðâûì
  1691. àðãóìåíòîì êîòîðîãî óêàçûâàåòñÿ filehandle.
  1692.  
  1693.      Î×ÅÍÜ ÂÀÆÍÛÉ ÌÎÌÅÍÒ.  Ðàçìåð öåëîãî òèïà äëÿ RawDoFmt() è âñåõ
  1694. èñïîëüçóþùèõ åãî ôóíêöèé - 16 áèò!  Òàêèì îáðàçîì, äëÿ ðàáîòû ñ
  1695. 32-áèòíûìè ÷èñëàìè íåîáõîäèìî ïðèìåíÿòü ôëàã «l».  Ïðèìåð:
  1696.  
  1697.      Printf("Ïå÷àòàåì 32-áèòíîå äåñÿòè÷íîå ÷èñëî: %ld\n",number);
  1698.  
  1699.      PutStr() - ïå÷àòü îáû÷íîé (íåôîðìàòíîé) ñòðîêè (D1).
  1700.      WriteChars() - ïå÷àòü ñòðîêè (D1) îïðåäåë¸ííîé äëèíû (D2).
  1701.  
  1702.      Àíàëîãîâ scanf() â DOS íåò.  Âïðî÷åì, ïî ïðè÷èíå ãðàôè÷åñêîé ñóòè
  1703. AmigaOS ïîäîáíûå ñðåäñòâà òîæå òðåáóþòñÿ èñêëþ÷èòåëüíî ðåäêî.
  1704. Ïðîãðàììû ñ êîíñîëüíûì èíòåðôåéñîì îãðàíè÷èâàþòñÿ àíàëèçîì êîìàíäíîé
  1705. ñòðîêè è âûâîäîì ñëóæåáíîé èíôîðìàöèè, âçàèìîäåéñòâèå ñ ïîëüçîâàòåëåì
  1706. ïðèíÿòî äåëàòü ñ ïîìîùüþ GUI.
  1707.  
  1708.      Ïðîãðàììà íå îãðàíè÷åíà ñâîèì êîíñîëüíûì îêíîì, îíà èìååò
  1709. âîçìîæíîñòü îòêðûòü åù¸ íåñêîëüêî ïîäîáíûõ îêîí.  Äëÿ ýòîãî íà çàïèñü
  1710. îòêðûâàåòñÿ ôàéë âèäà «CON:» èëè «RAW:».  Ïåðâîå îò âòîðîãî îòëè÷àåòñÿ
  1711. òåì, ÷òî â ñëó÷àå CON âåñü êëàâèàòóðíûé ââîä áóôåðèçóåòñÿ, è ïðîãðàììà
  1712. ïîëó÷àåò ãîòîâóþ ñòðîêó ïî íàæàòèþ ENTER (÷òî ïîçâîëÿåò îðãàíèçîâàòü
  1713. ðåäàêòîð ñòðîêè è history-áóôåð), à â ñëó÷àå RAW ëþáîé ââåä¸ííûé
  1714. ñèìâîë òóò æå ïîñòóïàåò âî âõîäíîé ïîòîê.  Êðîìå òîãî, ââåä¸ííûå
  1715. â CON ñèìâîëû òóò æå îòîáðàæàþòñÿ â îêíå, à â ñëó÷àå RAW ýòîãî íå
  1716. ïðîèñõîäèò.  Shell-îêíî, â êîòîðîì ðàáîòàåò ïðîãðàììà, èìååò òèï CON.
  1717.      Ïîñëå èìåíè óñòðîéñòâà ìîæíî ÷åðåç ñëýø óêàçûâàòü ïàðàìåòðû.  Ýòî
  1718. ïîäðîáíî ðàñïèñàíî â êíèãå Ä.Ìèõàéëîâà «AMIGA #1».
  1719.  
  1720.      Ñóùåñòâóåò ñïîñîá îòêðûòèÿ íîâîãî ôàéëà, ÷òîáû ââîä-âûâîä áûë
  1721. íàïðàâëåí íà òåêóùåå îêíî.  Äëÿ ýòîãî èñïîëüçóåòñÿ èìÿ «CONSOLE:».
  1722. Äàííûé ñïîñîá óäîáåí äëÿ ïðîãðàìì, êîòîðûå âûâîäÿò èíôîðìàöèþ òîëüêî
  1723. â ôàéë, à íå â Output().
  1724.  
  1725.  
  1726.  38) Îáðàáîòêà îøèáîê
  1727.  
  1728.      Ïîñêîëüêó ïðèçíàêîì îøèáêè îáû÷íî ÿâëÿåòñÿ íóëü èëè ìèíóñ
  1729. åäèíèöà, à ïðè÷èí îøèáîê ìîæåò áûòü ìíîæåñòâî, â DOS ñóùåñòâóåò
  1730. ìåõàíèçì «âòîðè÷íûõ» êîäîâ îøèáîê.
  1731.      Åñëè ïðîèçîøëà îøèáêà, å¸ êîä ìîæíî âûÿñíèòü ôóíêöèåé IoErr() áåç
  1732. àðãóìåíòîâ.  Êîäû îøèáîê DOS îïèñàíû â <dos/dos.#?>.  Ýòîò æå
  1733. ìåõàíèçì èñïîëüçóåòñÿ âî ìíîãèõ äðóãèõ ñèñòåìíûõ áèáëèîòåêàõ.  Äëÿ
  1734. õðàíåíèÿ êîäà îøèáêè èñïîëüçóåòñÿ ñïåöèàëüíî âûäåëåííîå äëÿ ýòîé öåëè
  1735. ïîëå ñòðóêòóðû Process - pr_Result2.
  1736.  
  1737.      ×òîáû íå âûâîäèòü ïîëüçîâàòåëþ íåâðàçóìèòåëüíûå íîìåðà, ñ êàæäîé
  1738. îøèáêîé ñâÿçàíà òåêñòîâàÿ ñòðîêà íà ÿçûêå, óñòàíîâëåííîì â ñèñòåìå.
  1739. Ýòà ñòðîêà âîçâðàùàåòñÿ ôóíêöèåé Fault(), àðãóìåíòû êîòîðîé - êîä
  1740. îøèáêè (D1), çàãîëîâîê (D2), áóôåð, êóäà áóäåò ñêîïèðîâàíà ñòðîêà (D3)
  1741. è åãî ðàçìåð (D4).
  1742.      Çàãîëîâîê - ñòðîêà, êîòîðàÿ áóäåò ðàçìåùåíà ïåðåä òåêñòîì, è
  1743. îòäåëåíà îò îïèñàíèÿ îøèáêè äâîåòî÷èåì.  Â ðåçóëüòàòå, ìîæíî ïîëó÷àòü
  1744. ñòðîêè òèïà «Can't create archive: object not found».
  1745.  
  1746.      PrintfFault() âûâîäèò òî æå â Output() - â ýòîì ñëó÷àå áóôåð è
  1747. åãî äëèíà íå óêàçûâàþòñÿ.
  1748.  
  1749.  
  1750.  39) Îïåðàöèè ñ îáúåêòàìè
  1751.  
  1752.      Â äàííîì êîíòåêñòå «îáúåêò» (object) - ýòî ïðîèçâîëüíûé ýëåìåíò
  1753. äèðåêòîðèè, áóäü òî ôàéë èëè ïîääèðåêòîðèÿ.
  1754.  
  1755.      DeleteFile(), íåñìîòðÿ íà íàçâàíèå, óäàëÿåò êàê çàäàííûé ôàéë
  1756. (D1), òàê è äèðåêòîðèþ.  Ïåðåä óäàëåíèåì äèðåêòîðèè äîëæíî áûòü
  1757. óäàëåíî âñ¸ å¸ ñîäåðæèìîå.
  1758.  
  1759.      Rename() ïåðåèìåíîâûâàåò îáúåêò, çàäàííûé ïåðâûì àðãóìåíòîì (D1),
  1760. âî âòîðîé (D2).  Ýòèì æå ñïîñîáîì îáúåêò ìîæíî ïåðåìåùàòü â äðóãóþ
  1761. äèðåêòîðèþ - íî òîëüêî íà òîì æå äèñêå!
  1762.  
  1763.      SetComment() óñòàíàâëèâàåò êîììåíòàðèé (D2) îáúåêòó (D1).
  1764.  
  1765.      SetFileDate() óñòàíàâëèâàåò ïðîèçâîëüíóþ äàòó/âðåìÿ ïîñëåäíåé
  1766. ìîäèôèêàöèè îáúåêòà (D1), çàäàííóþ ñòðóêòóðîé DateStamp (D2).
  1767.  
  1768.      SetProtection() óñòàíàâëèâàåò HSPARWED ôëàãè (D2) ôàéëó (D1).
  1769.  
  1770.  
  1771.  40) ×òî òàêîå Lock
  1772.  
  1773.      Ôóíêöèÿ Lock() ïîçâîëÿåò îãðàíè÷èòü äîñòóï ê îáúåêòó.  Äîñòóï
  1774. ìîæíî îãðàíè÷èòü ëèáî òîëüêî ïî çàïèñè (shared lock), ëèáî êàê ïî
  1775. çàïèñè, òàê è ïî ÷òåíèþ (exclusive lock).  Â ëþáîì ñëó÷àå áóäåò
  1776. çàïðåùåíà âñÿêàÿ ìîäèôèêàöèÿ ñîäåðæèìîãî îáúåêòà, âêëþ÷àÿ åãî
  1777. óäàëåíèå.  Àðãóìåíòû - èìÿ îáúåêòà (D1) è òèï Lock (D2), ïðèíèìàþùèé
  1778. çíà÷åíèÿ ACCESS_READ (shared) èëè ACCESS_WRITE (exclusive).
  1779.      Ðåçóëüòàò ýòîé ôóíêöèè - óíèêàëüíîå 32-áèòíîå ÷èñëî, ïî ñóòè
  1780. íåìíîãî ïîõîæåå íà filehandle.  Lock ñóùåñòâóåò äî òåõ ïîð, ïîêà íå
  1781. áóäåò âûïîëíåíà ôóíêöèÿ UnLock() (D1), ðåçóëüòàòîì êîòîðîé ÿâëÿåòñÿ
  1782. îñâîáîæäåíèå îáúåêòà, à lock ñòàíîâèòñÿ íåäåéñòâèòåëüíûì.
  1783.  
  1784.      Ïðè îòêðûòèè ôàéëà ôóíêöèåé Open() ïðåäâàðèòåëüíî âûïîëíÿòü
  1785. Lock() ÍÅ ÍÓÆÍΠ- ýòî äåëàåòñÿ ñèñòåìîé êàê áû àâòîìàòè÷åñêè.
  1786.  
  1787.      Èìåÿ lock íà ôàéë (íå íà äèðåêòîðèþ!), ìîæíî «ïåðåäåëàòü» åãî â
  1788. filehandle (îáðàòíîå íåâîçìîæíî).  Äëÿ ýòîãî ñóùåñòâóåò ôóíêöèÿ
  1789. OpenFromLock(), àðãóìåíòîì êîòîðîé ñëóæèò lock (D1).  Åñëè ôóíêöèÿ
  1790. âûïîëíåíà óñïåøíî (íå íóëåâîé ðåçóëüòàò), lock ñ ýòîãî ìîìåíòà
  1791. íåäåéñòâèòåëåí, è UnLock() äåëàòü ÍÅ ÍÓÆÍΠ(ñóäÿ ïî âñåìó, äîñòàòî÷íî
  1792. ðàñïðîñòðàí¸ííàÿ ïðîãðàììåðñêàÿ îøèáêà) - è âìåñòî íåãî ïî çàâåðøåíèþ
  1793. ðàáîòû íóæíî âûïîëíèòü Close().
  1794.  
  1795.      Ïðè íåîáõîäèìîñòè ìîæíî ïîëó÷èòü äóáëèêàò Lock-à - äëÿ ýòîãî
  1796. ñóùåñòâóåò ôóíêöèÿ DupLock(), êîòîðîé ïåðåäà¸òñÿ èìåþùèéñÿ lock (D1).
  1797. Ýòî ïîçâîëÿåò ïîëó÷èòü êîïèþ lock-à, íàïðèìåð, äëÿ äðóãîé çàäà÷è.
  1798. Ïðîñòîå êîïèðîâàíèå lock-à ñ ýòîé öåëüþ íåäîïóñòèìî!
  1799.  
  1800.      DupLockFromFH() ïîçâîëÿåò ïîëó÷èòü Lock ïî filehandle (D1).
  1801.  îòëè÷èå îò OpenFromLock(), filehandle îñòà¸òñÿ äåéñòâèòåëüíûì.
  1802.  
  1803.      SameLock(), ïîëó÷àþùàÿ äâà lock-à (D1, D2), ïîçâîëÿåò âûÿñíèòü,
  1804. ïðèíàäëåæàò ëè ýòè lock-è îäíîìó îáúåêòó.  Ðåçóëüòàòîì ìîæåò áûòü:
  1805.  
  1806.      LOCK_SAME        - îäèí è òîò æå îáúåêò
  1807.      LOCK_SAME_VOLUME - ðàçíûå îáúåêòû â ïðåäåëàõ îäíîãî äèñêà
  1808.      LOCK_DIFFERENT   - ðàçíûå îáúåêòû íà ðàçíûõ äèñêàõ
  1809.  
  1810.      Ïîõîæàÿ ôóíêöèÿ SameDevice() ïîçâîëÿåò îïðåäåëèòü, íàõîäÿòñÿ ëè
  1811. îáúåêòû â ïðåäåëàõ îäíîãî ôèçè÷åñêîãî óñòðîéñòâà (âîçìîæíî, íà ðàçíûõ
  1812. ðàçäåëàõ).
  1813.  
  1814.  
  1815.  41) Òåêóùàÿ äèðåêòîðèÿ
  1816.  
  1817.      Òåêóùóþ äèðåêòîðèþ ìîæíî èçìåíèòü ôóíêöèåé CurrentDir(),
  1818. àðãóìåíòîì êîòîðîé ÿâëÿåòñÿ lock íà íîâóþ òåêóùóþ äèðåêòîðèþ (D1).
  1819. Ðåçóëüòàò å¸ - lock íà ñòàðóþ.
  1820.      Ñóùåñòâóåò äâà ïðàâèëà, êîòîðûå íóæíî îáÿçàòåëüíî ñîáëþäàòü:
  1821.  
  1822.    - lock íà òåêóùóþ äèðåêòîðèþ äîëæåí áûòü âàëèäíûì ÂѨ âðåìÿ, ïîêà
  1823.      îíà îñòà¸òñÿ òåêóùåé.  Åñëè íàä íèì âûïîëíåí UnLock(), ïîïûòêà
  1824.      îáðàùåíèÿ ïî ïóòè îòíîñèòåëüíî òåêóùåé äèðåêòîðèè ïðèâåä¸ò ê ñáîþ
  1825.      ñèñòåìû!
  1826.  
  1827.    - ïðîãðàììà ÎÁßÇÀÍÀ ïðè âûõîäå ñäåëàòü òåêóùåé òó äèðåêòîðèþ,
  1828.      êîòîðóþ îíà ïîëó÷èëà ïðè ñòàðòå.  Åäèíñòâåííîå èñêëþ÷åíèå èç
  1829.      ýòîãî ïðàâèëà - êîìàíäà cd.
  1830.  
  1831.      Lock íà òåêóùóþ äèðåêòîðèþ ìîæåò áûòü íóë¸ì - ýòî îçíà÷àåò
  1832. êîðíåâóþ äèðåêòîðèþ ñèñòåìíîãî äèñêà.
  1833.  
  1834.  
  1835.  42) Äèðåêòîðèÿ, îòêóäà çàïóùåíà ïðîãðàììà
  1836.  
  1837.      Ðàçóìååòñÿ, ýòà äèðåêòîðèÿ çàùèùåíà lock-îì.  Ýòîò lock ìîæíî
  1838. ïîëó÷èòü ôóíêöèåé GetProgramDir() áåç àðãóìåíòîâ.  Âûïîëíÿòü UnLock()
  1839. íà í¸ì ÍÅËÜÇß!
  1840.  
  1841.      Ñóùåñòâóåò åù¸ îäèí ñïîñîá äîñòóïà ê ýòîé äèðåêòîðèè - óêàçàíèå
  1842. «PROGDIR:» â ïóòè ê íåé.
  1843.  
  1844.  
  1845.  43) Ëèíêè
  1846.  
  1847.      Ëèíêè ïðåäñòàâëÿþò ñîáîé ñðåäñòâî ñîçäàíèÿ íåñêîëüêèõ îáúåêòîâ,
  1848. ôèçè÷åñêè ññûëàþùèõñÿ íà îäèí è òîò æå îáúåêò íà äèñêå. Ñóùåñòâóåò äâà
  1849. òèïà ëèíêîâ - hard è soft.
  1850.  
  1851.      Hard-ëèíêè ïðåäñòàâëÿþò ñîáîé íåñêîëüêî çàïèñåé â êàòàëîãå äèñêà,
  1852. ôèçè÷åñêè ññûëàþùèõñÿ íà îäèí è òîò æå îáúåêò.  Âñå îíè äîëæíû
  1853. íàõîäèòüñÿ â ïðåäåëàõ îäíîãî äèñêà.  Ýòè çàïèñè ðàâíîöåííû, è îáúåêò
  1854. ñóùåñòâóåò äî òåõ ïîð, ïîêà ñóùåñòâóåò õîòÿ áû îäíà çàïèñü î í¸ì.
  1855.  
  1856.      Soft-ëèíêè ïðåäñòàâëÿþò ñîáîé ïóòü, ôàêòè÷åñêè â âèäå òåêñòîâîé
  1857. ñòðîêè.  Îíè ìîãóò ññûëàòüñÿ íà ëþáîé îáúåêò, ëþáîãî òèïà, íà ëþáîì
  1858. äèñêå.  Íàëè÷èå îáúåêòà íå ïðîâåðÿåòñÿ.
  1859.  
  1860.      Äëÿ ñîçäàíèÿ ëèíêà èñïîëüçóåòñÿ ôóíêöèÿ MakeLink(), êîòîðîé
  1861. ïåðåäà¸òñÿ èìÿ ëèíêà (D1), îáúåêò, íà êîòîðûé ñîçäà¸òñÿ ëèíê (D2) è
  1862. òèï ëèíêà (D3) - íóëü äëÿ hard-ëèíêîâ, íå íóëü äëÿ soft-ëèíêîâ.
  1863.      Â ñëó÷àå ñîçäàíèÿ soft-ëèíêà âòîðûì àðãóìåíòîì ïåðåäà¸òñÿ
  1864. òåêñòîâàÿ ñòðîêà, â ñëó÷àå æå hard-ëèíêà ýòî äîëæåí áûòü lock íà
  1865. îáúåêò.
  1866.  
  1867.      Íåñìîòðÿ íà òî, ÷òî ôèçè÷åñêè soft-ëèíê ñîäåðæèò ïóòü, ïðè
  1868. äîñòóïå ê íåìó (Open() èëè Lock()), ðàçóìååòñÿ, ìû ïîëó÷àåì òîò
  1869. îáúåêò, íà êîòîðûé îí ññûëàåòñÿ.  ×òîáû ñ÷èòàòü ññûëêó, ïðèìåíÿåòñÿ
  1870. ReadLink() - îïèñàííûé â dos.doc.
  1871.  
  1872.  
  1873.  44) Ðàáîòà ñ äèðåêòîðèÿìè
  1874.  
  1875.      Ïðîãðàììû òèïà Directory Opus äîëæíû èìåòü ñðåäñòâî ñ÷èòûâàíèÿ
  1876. ðàçëè÷íûõ ïàðàìåòðîâ ôàéëîâ è äèðåêòîðèé - êîììåíòàðèåâ, äàò ñîçäàíèÿ,
  1877. èì¸í, ðàçìåðîâ...
  1878.  
  1879.      Äëÿ ñ÷èòûâàíèÿ èíôîðìàöèè îá îäèíî÷íîì îáúåêòå èñïîëüçóåòñÿ
  1880. ôóíêöèÿ Examine(), êîòîðîé ïåðåäà¸òñÿ lock íà îáúåêò (D1) è óêàçàòåëü
  1881. íà ñòðóêòóðó FileInfoBlock (D2), êîòîðóþ çàïîëíèò ýòà ôóíêöèÿ.
  1882. Ïîõîæàÿ ôóíêöèÿ ExamineFH() îòëè÷àåòñÿ òåì, ÷òî âìåñòî lock ïîëó÷àåò â
  1883. êà÷åñòâå ïåðâîãî àðãóìåíòà filehandle.
  1884.      Ñòðóêòóðà FileInfoBlock <dos/dos.#?> îáÿçàòåëüíî äîëæíà
  1885. èìåòü àäðåñ, êðàòíûé ÷åòûð¸ì (â SAS/Ñ ýòî äåëàåòñÿ êëþ÷îì __aligned
  1886. ïåðåä îïèñàíèåì ñòðóêòóðû, íà àññåìáëåðå ïåðåä ñòðóêòóðîé íóæíî
  1887. íàïèñàòü cnop 0,4).  Íàçíà÷åíèå å¸ ïîëåé òàêîâî:
  1888.  
  1889.      fib_DiskKey      - äëÿ OFS/FFS - íîìåð áëîêà íà äèñêå,
  1890.                         áîëüøèíñòâîì îñòàëüíûõ FS íå èñïîëüçóåòñÿ
  1891.      fib_DirEntryType - òèï îáúåêòà <dos/dosextens.#?>:
  1892.                          ST_ROOT     - êîðíåâàÿ äèðåêòîðèÿ
  1893.                          ST_USERDIR  - îáû÷íàÿ äèðåêòîðèÿ
  1894.                          ST_SOFTLINK - soft-link
  1895.                          ST_LINKDIR  - hard-link íà äèðåêòîðèþ
  1896.                          ST_FILE     - ôàéë
  1897.                          ST_LINKFILE - hard-link íà ôàéë
  1898.                          ST_PIPEFILE - «pipe:»
  1899.                         Â îáùåì ñëó÷àå, ïîëîæèòåëüíîå çíà÷åíèå
  1900.                         îçíà÷àåò äèðåêòîðèþ, à îòðèöàòåëüíîå - ôàéë.
  1901.      fib_FileName     - èìÿ (íå óêàçàòåëü, à 108 áàéò èìåíè)
  1902.      fib_Protection   - ôëàãè HSPARWED
  1903.      fib_EntryType    - íåäîêóìåíòèðîâàíî, íå âçäóìàéòå èñïîëüçîâàòü
  1904.      fib_Size         - äëèíà ôàéëà
  1905.      fib_NumBlocks    - ñêîëüêî áëîêîâ äèñêà çàíèìàåò îáúåêò, â ò.÷.
  1906.                         äèðåêòîðèÿ.  Èñïîëüçîâàòü íå ðåêîìåíäóåòñÿ
  1907.      fib_Date         - ñòðóêòóðà DateStamp - äàòà/âðåìÿ ïîñëåäíåé
  1908.                         ìîäèôèêàöèè îáúåêòà
  1909.      fib_Comment      - êîììåíòàðèé (íå óêàçàòåëü, à 79 áàéò)
  1910.      fib_OwnerUID     - èñïîëüçóþòñÿ òîëüêî äëÿ multiuser,
  1911.      fib_OwnerGID       íà îáû÷íûõ ôàéëîâûõ ñèñòåìàõ íåäåéñòâèòåëüíû
  1912.  
  1913.      Äëÿ òîãî, ÷òîáû ïîëó÷èòü èíôîðìàöèþ îáî âñåé äèðåêòîðèè, äåëàåòñÿ
  1914. ñëåäóþùåå:  ñíà÷àëà âûïîëíÿåòñÿ Examine(), âîçâðàùàþùàÿ èíôîðìàöèþ îá
  1915. ýòîé äèðåêòîðèè, à ïîòîì ïîñëåäîâàòåëüíî âûïîëíÿåòñÿ ôóíêöèÿ ExNext()
  1916. ñ òåìè æå àðãóìåíòàìè, êàæäûé âûçîâ êîòîðîé âîçâðàòèò ñâåäåíèÿ îá
  1917. î÷åðåäíîì îáúåêòå äèðåêòîðèè.  Î÷åâèäíî, ÷òî FileInfoBlock â òå÷åíèå
  1918. âñåãî ïðîöåññà äîëæåí áûòü îäíèì è òåì æå.
  1919.      ExNext() ñëåäóåò âûïîëíÿòü äî òåõ ïîð, ïîêà îí íå âåðí¸ò FALSE.
  1920. Ïîñëå ýòîãî íóæíî óáåäèòüñÿ, ÷òî êîä îøèáêè (IoErr()) ñîîòâåòñòâóåò
  1921. ERROR_NO_MORE_ENTRIES - â ïðîòèâíîì ñëó÷àå ýòî äåéñòâèòåëüíî îøèáêà
  1922. îáðàùåíèÿ ê äèñêó.
  1923.  
  1924.      Ñóùåñòâóåò åù¸ îäèí ñïîñîá ñ÷èòûâàíèÿ äèðåêòîðèè - öåëèêîì.  Äëÿ
  1925. ýòîãî ñóùåñòâóþò ôóíêöèè ExAll() è ExAllEnd().  Èíòåðåñóþùèåñÿ ìîãóò
  1926. îçíàêîìèòüñÿ ñ íèìè â dos.doc.
  1927.  
  1928.      Ôóíêöèÿ CreateDir() ïîçâîëÿåò ñîçäàòü íîâóþ äèðåêòîðèþ.  Åé
  1929. ïåðåäà¸òñÿ èìÿ äèðåêòîðèè (D1).  Ðåçóëüòàò - exclusive lock íà í帠èëè
  1930. íóëü â ñëó÷àå îøèáêè.
  1931.      ParentDir() ïîçâîëÿåò íàéòè ðîäèòåëüñêóþ äèðåêòîðèþ ïî lock-ó íà
  1932. ëþáîé îáúåêò â íåé (D1).  Ïîõîæàÿ ôóíêöèÿ ParentOfFH() äåëàåò òî æå
  1933. ñàìîå ïî filehandle.
  1934.  
  1935.  
  1936.  45) Øàáëîíû
  1937.  
  1938.      Øàáëîíû (îíè æå «ìàñêè» è «ðåãóëÿðíûå âûðàæåíèÿ») - ìåõàíèçì äëÿ
  1939. èäåíòèôèêàöèè ñòðîê, óäîâëåòâîðÿþùèõ îïðåäåë¸ííûì ïðàâèëàì.  Ïîäðîáíî
  1940. îïèñàíû â êíèãå Ä.Ìèõàéëîâà.  Øàáëîíû ìîæíî èñïîëüçîâàòü íå òîëüêî äëÿ
  1941. èì¸í ôàéëîâ, íî è âîîáùå äëÿ ïðîèçâîëüíûõ öåëåé.
  1942.  
  1943.      Ôóíêöèÿ ParsePattern() ïåðåâîäèò øàáëîí âî âíóòðåííèé ôîðìàò, â
  1944. êîòîðîì îí èñïîëüçóåòñÿ äëÿ èäåíòèôèêàöèè ñòðîêè. Øàáëîí âî âíóòðåííåì
  1945. ôîðìàòå ìîæåò çàíèìàòü áîëåå ÷åì â äâà ðàçà áîëüøå, ÷åì èñõîäíàÿ
  1946. ñòðîêà. Àðãóìåíòû ôóíêöèè - èñõîäíàÿ ñòðîêà (D1), áóôåð äëÿ øàáëîíà
  1947. (D2) è åãî ðàçìåð (D3).
  1948.      Ðåçóëüòàò ôóíêöèè: íóëü - ñòðîêà íå ÿâëÿåòñÿ øàáëîíîì,
  1949.                            1 - ñòðîêà îáðàáîòàíà óñïåøíî,
  1950.                           -1 - ïåðåïîëíåíèå áóôåðà èëè äðóãàÿ îøèáêà.
  1951.  
  1952.      Ðåçóëüòàò ðàáîòû ParsePattern() èñïîëüçóåòñÿ â MatchPattern().
  1953. Àðãóìåíòû - øàáëîí âî âíóòðåííåì ôîðìàòå (D1) è ïðîâåðÿåìàÿ ñòðîêà
  1954. (D2).  Ôóíêöèÿ ÿâëÿåòñÿ ðåêóðñèâíîé è âåñüìà òðåáîâàòåëüíà ê ñòåêó!
  1955.  
  1956.      Îïèñàííûå ôóíêöèè - case-sensitive (òî åñòü çàãëàâíûå è ñòðî÷íûå
  1957. áóêâû äëÿ íèõ ðàçëè÷íû).  Åñëè òðåáóåòñÿ, ÷òîáû çàãëàâíûå è ñòðî÷íûå
  1958. íå ðàçëè÷àëèñü, íóæíî èñïîëüçîâàòü äðóãóþ ïàðó: MatchPatternNoCase()
  1959. è ParsePatternNoCase()
  1960.  
  1961.      Ñóùåñòâóåò ìåõàíèçì ðàáîòû ñ îáúåêòàìè äèðåêòîðèè ïî øàáëîíàì.
  1962. Äëÿ ýòîãî ñóùåñòâóþò ôóíêöèè MatchFirst(), MatchNext() è MatchEnd().
  1963. Áîëåå ïîäðîáíî - ÷èòàéòå dos.doc.
  1964.  
  1965.  
  1966.  46) Íîòèôèêàöèÿ
  1967.  
  1968.      Íîòèôèêàöèÿ ïðåäñòàâëÿåò ñîáîé ìåõàíèçì èíôîðìèðîâàíèÿ Âàøåé
  1969. çàäà÷è îá èçìåíåíèÿõ, ïðîèçîøåäøèõ ñ ôàéëîâîé ñèñòåìîé.  Îáû÷íî îíà
  1970. èñïîëüçóåòñÿ â ïðîãðàììàõ òèïà Directory Opus.
  1971.      Íå âñå òèïû ôàéëîâûõ ñèñòåì ïîääåðæèâàþò ýòó âîçìîæíîñòü -
  1972. íàïðèìåð, äëÿ ñåòåé îíà ìîæåò áûòü íåðåàëèçóåìà.  Ïðîãðàììà íå äîëæíà
  1973. òðåáîâàòü íàëè÷èÿ íîòèôèêàöèè, è äîëæíà óìåòü îáõîäèòüñÿ áåç íå¸.
  1974.  
  1975.      StartNotify() ïîëó÷àåò àðãóìåíòîì óêàçàòåëü (D1) íà ñòðóêòóðó
  1976. NotifyRequest.  Ñòðóêòóðà çàïîëíÿåòñÿ äî âûçîâà ôóíêöèè, è äîëæíà áûòü
  1977. íåèçìåííîé äî âûïîëíåíèÿ EndNotify().  nr_Name <dos/notify.#?>
  1978. óêàçûâàåò íà ñòðîêó - èìÿ îáúåêòà, çà êîòîðûì ìû ñîáèðàåìñÿ ñëåäèòü.
  1979. Äëÿ ôàéëà îòñëåæèâàåòñÿ ôàêò åãî çàêðûòèÿ.  Â ñëó÷àå èçìåíåíèÿ ìîãóò
  1980. áûòü äâà âàðèàíòà ðåàêöèè - ïîñûëêà ñîîáùåíèÿ ëèáî ïîñûëêà ñèãíàëà.
  1981. Âàðèàíò ðåàêöèè çàâèñèò îò ñîäåðæàíèÿ ïîëÿ nr_Flags (NRF_SEND_MESSAGE
  1982. èëè NRF_SEND_SIGNAL).  Â çàâèñèìîñòè îò âàðèàíòà íóæíî çàïîëíèòü ïîëÿ
  1983. nr_Msg èëè nr_Signal.
  1984.  
  1985.      EndNotify() ñ òåì æå àðãóìåíòîì çàâåðøàåò íîòèôèêàöèþ.  Åãî ìîæíî
  1986. âûçûâàòü äàæå â ñëó÷àå, åñëè StartNotify() âåðíóë îøèáêó.  Â ñëó÷àå
  1987. NRF_SEND_MESSAGE ôóíêöèÿ î÷èùàåò ïîðò îò âñåõ íàêîïèâøèõñÿ ñîîáùåíèé.
  1988.  
  1989.  
  1990.  47) Îïåðàöèè ñ ôàéëîâûìè ñèñòåìàìè â öåëîì
  1991.  
  1992.      Äëÿ óñòðîéñòâ, ïðåäñòàâëÿþùèõ ñîáîé ôàéëîâûå ñèñòåìû, DOS
  1993. ïðåäîñòàâëÿåò íàáîð «ãëîáàëüíûõ» îïåðàöèé.  Êàê óæå óïîìèíàëîñü,
  1994. ôóíêöèÿ IsFileSystem() ïîçâîëÿåò îïðåäåëèòü òèï óñòðîéñòâà.
  1995.  
  1996.      Info() ïî lock-ó íà ëþáîé îáúåêò íà äèñêå (D1) çàïîëíÿåò
  1997. ñòðóêòóðó InfoData (D2) èíôîðìàöèåé î äèñêå.  Ýòà ñòðóêòóðà
  1998. <dos/dos.#?> äîëæíà èìåòü àäðåñ, êðàòíûé ÷åòûð¸ì, è ñîäåðæèò
  1999. ñëåäóþùèå ïîëÿ:
  2000.  
  2001.      id_NumSoftErrors - êîëè÷åñòâî îøèáîê â ôàéëîâîé ñèñòåìå
  2002.      id_UnitNumber    - íîìåð óñòðîéñòâà
  2003.      id_DiskState     - ñîñòîÿíèå äèñêà, ïðèíèìàåò ñëåäóþùèå çíà÷åíèÿ:
  2004.                         ID_WRITE_PROTECTED - çàùèòà îò çàïèñè
  2005.                         ID_VALIDATING      - èä¸ò âàëèäàöèÿ (OFS/FFS)
  2006.                         ID_VALIDATED       - âñ¸ ok
  2007.      id_NumBlocks     - îáú¸ì äèñêà â áëîêàõ
  2008.      id_NumBlocksUsed - ñêîëüêî áëîêîâ çàíÿòî
  2009.      id_BytesPerBlock - ðàçìåð áëîêà
  2010.      id_DiskType      - òèï ôàéëîâîé ñèñòåìû:
  2011.                         ID_NO_DISK_PRESENT  - äèñê íå âñòàâëåí
  2012.                         ID_UNREADABLE_DISK  - äèñê íå ÷èòàåòñÿ
  2013.                         ID_DOS_DISK         - OFS
  2014.                         ID_FFS_DISK         - FFS
  2015.                         ID_INTER_DOS_DISK   - OFS intl
  2016.                         ID_INTER_FFS_DISK   - FFS intl
  2017.                         ID_FASTDIR_DOS_DISK - OFS DC
  2018.                         ID_FASTDIR_FFS_DISK - FFS DC
  2019.                         ID_NOT_REALLY_DOS   - NDOS
  2020.                         ID_KICKSTART_DISK   - A1000 ROM
  2021.                         ID_MSDOS_DISK       - MS-DOS
  2022.                         Âîçìîæíû è äðóãèå çíà÷åíèÿ, íàïðèìåð â ñëó÷àå
  2023.                         AFS, PFS, SFS, Macintosh HFS...
  2024.  
  2025.      Inhibit() - «âûêëþ÷åíèå» ôàéëîâîé ñèñòåìû.  Èñïîëüçóåòñÿ äëÿ
  2026. òîãî, ÷òîáû ïîëó÷èòü äîñòóï ê äèñêó íàïðÿìóþ áåç ðèñêà êîíôëèêòîâ ñ
  2027. ôàéëîâîé ñèñòåìîé.  Ýòó âîçìîæíîñòü, íàïðèìåð, èñïîëüçóþò DMS è
  2028. DiskSalv.  Àðãóìåíòû - èìÿ óñòðîéñòâà (D1) è ôëàã TRUE/FALSE (D2).
  2029. TRUE «âûêëþ÷àåò» ôàéëîâóþ ñèñòåìó, FALSE «âêëþ÷àåò» å¸ îáðàòíî.
  2030.  
  2031.      Format() - èíèöèàëèçàöèÿ ôàéëîâîé ñòðóêòóðû, èìåííî ýòà ôóíêöèÿ
  2032. âûïîëíÿåòñÿ äëÿ QuickFormat.  Àðãóìåíòû - ôèçè÷åñêîå èìÿ óñòðîéñòâà
  2033. (D1 - íàïðèìåð, «DF0:»), èìÿ äèñêà ÁÅÇ ÄÂÎÅÒÎ×Èß (D2 - íàïðèìåð,
  2034. «System»), è òèï ôàéëîâîé ñèñòåìû, åñëè îíà ïîääåðæèâàåò íåñêîëüêî
  2035. òèïîâ.  Ïåðåä âûïîëíåíèåì Format() ñëåäóåò âûïîëíèòü Inhibit(), èíà÷å
  2036. áóäåò îøèáêà.
  2037.  
  2038.      Relabel() ïîçâîëÿåò ñìåíèòü ëîãè÷åñêîå èìÿ äèñêà, ïîëó÷àÿ èìÿ
  2039. óñòðîéñòâà (D1) è íîâîå èìÿ äèñêà ÁÅÇ ÄÂÎÅÒÎ×Èß (D2).
  2040.  
  2041.      AddBuffers() ïîçâîëÿåò óïðàâëÿòü ðàçìåðîì êýøà ôàéëîâîé ñèñòåìû.
  2042. Àðãóìåíòû - èìÿ óñòðîéñòâà (D1) è çíà÷åíèå, íà êîòîðîå óâåëè÷èâàåòñÿ
  2043. ðàçìåð êýøà â áëîêàõ (D2).  Äëÿ óìåíüøåíèÿ óêàçûâàåòñÿ îòðèöàòåëüíûì.
  2044. Ðàçìåð áëîêà çàâèñèò îò ôàéëîâîé ñèñòåìû.
  2045.  
  2046.  
  2047.  48) DOS-Packets
  2048.  
  2049.      DOS-Packets - ìåõàíèçì íèçêîóðîâíåâîé ðàáîòû ñ DOS.  Áîëüøèíñòâî
  2050. ïåðå÷èñëåííûõ ðàíåå ôóíêöèé DOS ðåàëüíî ïðåäñòàâëÿåò ñîáîé
  2051. âûñîêîóðîâíåâóþ îáîëî÷êó ê DOS-ïàêåòàì, ðåàëèçóþùóþ, íàïðèìåð,
  2052. ðåêâåñòîðû ïðè îøèáêàõ (Retry/Cancel) è áóôåðèçàöèþ.  Ôàêòè÷åñêè
  2053. DOS-ïàêåòû ïðåäñòàâëÿþò ñîáîé ñîîáùåíèÿ Exec.
  2054.  
  2055.      Èñïîëüçîâàíèå DOS-ïàêåòîâ èìååò ñìûñë äëÿ ñëåäóþùèõ çàäà÷:
  2056.  
  2057.    - àñèíõðîííûé ââîä-âûâîä
  2058.    - îòêëþ÷åíèå ðåêâåñòîðîâ ïðè îøèáêå
  2059.    - îïåðàöèè ñ ôàéëîâûìè ñèñòåìàìè, íå îãðàíè÷åííûå âîçìîæíîñòÿìè DOS
  2060.  
  2061.      DOS-ïàêåò ïðåäñòàâëåí ñòðóêòóðîé StandardPacket, ñîäåðæàùåé
  2062. ñòðóêòóðû Message (ïîëå sp_Msg) è DosPacket (sp_Pkt).  Ñòðóêòóðà
  2063. DosPacket ñîäåðæèò ñëåäóþùèå ïîëÿ:
  2064.  
  2065.      dp_Link - óêàçàòåëü íà sp_Msg <dos/dosextens.#?>
  2066.      dp_Port - ReplyPort äëÿ ïàêåòà.  Äëÿ âûïîëíåíèÿ âûñîêîóðîâíåâûõ
  2067.                ôóíêöèé DOS èñïîëüçóåò pr_MsgPort ïðîöåññà.  Ïðè
  2068.                àñèíõðîííîé ðàáîòå ñ DOS ïîðò íóæíî ñîçäàòü ñàìîìó.
  2069.      dp_Type - êîä îïåðàöèè
  2070.                Êîäû îïåðàöèé ïåðå÷èñëåíû â <dos/dosextens.#?>
  2071.      dp_Res1 - ðåçóëüòàò (òî, ÷òî âîçâðàùàþò ôóíêöèè DOS)
  2072.      dp_Res2 - âòîðè÷íûé êîä îøèáêè (IoErr())
  2073.      dp_Arg1
  2074.      dp_Arg2
  2075.      dp_Arg3
  2076.      dp_Arg4
  2077.      dp_Arg5
  2078.      dp_Arg6
  2079.      dp_Arg7 - àðãóìåíòû.  Ñïåöèôè÷íû äëÿ âûïîëíÿåìîé îïåðàöèè.
  2080.  
  2081.      Èñïîëüçîâàíèå DOS-ïàêåòîâ ïî ñóòè ïîõîæå íà ðàáîòó ñ äåâàéñàìè.
  2082. DOS ïðåäîñòàâëÿåò àíàëîãè÷íûé ðàáîòå ñ äåâàéñàìè íàáîð ôóíêöèé:
  2083.  
  2084.      DoPkt()
  2085.      SendPkt()
  2086.      WaitPkt()
  2087.      ReplyPkt()
  2088.      AbortPkt()
  2089.  
  2090.      Ôóíêöèè îïèñàíû â dos.doc.  Ïîðò, â êîòîðûé îòïðàâëÿåòñÿ
  2091. ñîîáùåíèå, áåð¸òñÿ èç filehandle (ïîëå fh_Arg1) - íå çàáóäüòå, ÷òî
  2092. filehandle ïðåäñòàâëÿåò ñîáîé BCPL-óêàçàòåëü!  Ýòî ïîðò õýíäëåðà
  2093. (èëè ôàéëîâîé ñèñòåìû), êîòîðàÿ îáñëóæèâàåò íóæíîå íàì óñòðîéñòâî.
  2094.      Ïåðåä âûïîëíåíèåì îïåðàöèè ñòðóêòóðà çàïîëíÿåòñÿ àðãóìåíòàìè è
  2095. êîäîì îïåðàöèè, çàòåì ñ ïîìîùüþ ïåðå÷èñëåííûõ ôóíêöèé ëèáî PutMsg()
  2096. ïîñûëàåòñÿ ñîîáùåíèå.  Ïî çàâåðøåíèè îïåðàöèè íà ñîîáùåíèå ïðèõîäèò
  2097. îòâåò, êîòîðûé ìîæíî îæèäàòü êàê ñ ïîìîùüþ WaitPkt(), òàê è ñ ïîìîùüþ
  2098. ñðåäñòâ Exec.
  2099.  
  2100.      Î÷åíü ïîäðîáíîå îïèñàíèå ðàáîòû ñ DOS Packets, à òàêæå ðÿä
  2101. ïðèìåðîâ ïðèâåäåíû â Guru Book.
  2102.  
  2103.      [to be continued]
  2104.